UIActivityViewController - 电子邮件和Twitter共享

ant*_*tic 34 email nsmutablearray ios ios6 uiactivity

我最近开始与UIActivity合作,将我的应用程序分享给全世界,但我遇到的问题很少.首先,我没有找到如何设置我的电子邮件的主题.有什么办法吗?其次,当我设置电子邮件的正文时,会有一个额外的"输入"(电子邮件的第一行是空白,我的文本从第二行开始).这是代码:

 NSMutableArray *array = [[NSMutableArray alloc] initWithObjects: @"Test", nil];

    UIActivityViewController *activityViewController = [[UIActivityViewController alloc]
                                   initWithActivityItems:array applicationActivities:nil];
Run Code Online (Sandbox Code Playgroud)

在电子邮件中,它显示:

"

测试"

第三:有没有办法知道选择了哪种共享方法?因为我希望在用户在Twitter上分享时在我的帖子中包含一个标签,但现在它也被集成在电子邮件中,这显然没有意义.

谢谢!

小智 50

为了在iOS6上使用UIActivityViewController 添加主题,这是任何人都可以使用的最佳解决方案.所有你需要做的就是在初始化UIActivityViewController时调用以下内容.

UIActivityViewController *activityViewController = [[UIActivityViewController alloc] initWithActivityItems:activityItems applicationActivities:applicationActivities];
[activityViewController setValue:@"My Subject Text" forKey:@"subject"];
Run Code Online (Sandbox Code Playgroud)

并且您的UIActivityViewController中填充了主题.

  • 这合法吗?它没有记录. (9认同)
  • 如果您决定使用它,请先检查您是否在 iOS 6 上运行。如果没有,使用新的 UIActivityItemSource 协议方法设置主题。 (2认同)

小智 24

在iOS7中,这可以通过使用 -

activityViewController:subjectForActivityType:
Run Code Online (Sandbox Code Playgroud)

发布项目时,服务可以提供单独的主题字段和数据字段,例如电子邮件消息.如果您希望为支持该服务的服务提供主题字段,请实施此方法.

检查- https://developer.apple.com/library/ios/documentation/uikit/reference/UIActivityItemSource_protocol/Reference/Reference.html#//apple_ref/occ/intfm/UIActivityItemSource/activityViewController:subjectForActivityType:


esp*_*esp 16

1和2:如何在iOS 6中为UIActivityViewController设置收件人?

尽管两种提供的方法都有点破解,特别是第一种,但这是可能的.

3:可以在不同的服务上共享不同的内容,但是项目的数量和类型应该相同(但这不是限制,实际上,因为对于特定服务不需要的项目,您可以返回nil ).使用UIActivityItemSource协议选择服务后,您必须创建共享项

我使用的代码:

使用当前控制器显示UIActivityViewController作为所有项目的提供者(它应该在.h文件中):

const int numberOfSharedItems = 5;

- (IBAction)shareAction:(id)sender
{
    NSMutableArray *shareItems = [NSMutableArray new];
        while ([shareItems count] < numberOfSharedItems)
            [shareItems addObject: self];

        UIActivityViewController *shareController =
            [[UIActivityViewController alloc]
                // actual items are prepared by UIActivityItemSource protocol methods below
                initWithActivityItems: shareItems
                applicationActivities :nil];

        shareController.excludedActivityTypes = @[UIActivityTypeMessage, UIActivityTypePrint, UIActivityTypeCopyToPasteboard, UIActivityTypeAssignToContact, UIActivityTypeSaveToCameraRoll];

        [self presentViewController: shareController animated: YES completion: nil];
}
Run Code Online (Sandbox Code Playgroud)

为要共享的项目创建占位符:

-(id)activityViewControllerPlaceholderItem:(UIActivityViewController *)activityViewController
{
    static UIActivityViewController *shareController;
    static int itemNo;
    if (shareController == activityViewController && itemNo < numberOfSharedItems - 1)
        itemNo++;
    else {
        itemNo = 0;
        shareController = activityViewController;
    }

    switch (itemNo) {
        case 0: return @""; // intro in email
        case 1: return @""; // email text
        case 2: return [NSURL new]; // link
        case 3: return [UIImage new]; // picture
        case 4: return @""; // extra text (via in twitter, signature in email)
        default: return nil;
    }
}
Run Code Online (Sandbox Code Playgroud)

为不同的服务制作将要共享的实际项目:

-(id)activityViewController:(UIActivityViewController *)activityViewController itemForActivityType:(NSString *)activityType
{
    // the number of item to share
    static UIActivityViewController *shareController;
    static int itemNo;
    if (shareController == activityViewController && itemNo < numberOfSharedItems - 1)
        itemNo++;
    else {
        itemNo = 0;
        shareController = activityViewController;
    }

    NSString *shareText = [self shareText]; // whatever you fancy
    NSURL *shareURL = [self shareURL];

    // twitter
    if ([activityType isEqualToString: UIActivityTypePostToTwitter])
        switch (itemNo) {
            case 0: return nil;
            case 1: return shareText; // you can change text for twitter, I add $ to stock symbol inside shareText here, e.g. Hashtags can be added too
            case 2: return shareURL;
            case 3: return nil; // no picture
            case 4: return @"via @YourApp";
            default: return nil;
        }

    // email
    else if ([activityType isEqualToString: UIActivityTypeMail])
        switch (itemNo) {
            case 0: return @"Hi!\r\n\r\nI used YourApp\r\n";
            case 1: return shareText;
            case 2: return shareURL;
            case 3: return nil; // no picture
            case 4: return [@"\r\nCheck it out.\r\n\r\nCheers\r\n" stringByAppendingString: [self userName]];
            default: return nil;
        }

    else // Facebook or something else in the future
        switch (itemNo) {
            case 0: return nil;
            case 1: return shareText;
            case 2: return shareURL;
            case 3: return [self shareImage];
            case 4: return nil;
            default: return nil;
        }
}
Run Code Online (Sandbox Code Playgroud)

  • 这个答案很有用,作为`UIActivityItemSource`协议如何工作并可以用于不同活动类型的一个例子,但我不建议按原样使用它 - 对`itemNo`的依赖和这些方法的顺序由内部`UIActivityViewController`代码调用...以可怕的方式烘烤... 如果他们碰巧改变他们打电话给你的方式,可以打破下游的一些方法. (4认同)