34

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

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

    UIActivityViewController *activityViewController = [[UIActivityViewController alloc]
                                   initWithActivityItems:array applicationActivities:nil];

在电子邮件中,它显示:

"

测试 ”

第三:有没有办法知道选择了哪种分享方式?因为当用户在推特上分享时,我想在我的帖子中包含一个主题标签,但现在它也被集成到电子邮件中,这显然没有意义。

谢谢!

4

5 回答 5

50

要在 iOS6 上使用 UIActivityViewController 为电子邮件添加主题,这是任何人都可以使用的最佳解决方案。您所要做的就是在初始化 UIActivityViewController 时调用以下命令。

UIActivityViewController *activityViewController = [[UIActivityViewController alloc] initWithActivityItems:activityItems applicationActivities:applicationActivities];
[activityViewController setValue:@"My Subject Text" forKey:@"subject"];

你的 UIActivityViewController 填充了一个主题。

于 2013-06-28T16:41:59.600 回答
24

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

activityViewController:subjectForActivityType:

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

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

于 2013-10-08T15:12:40.477 回答
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];
}

为将要共享的项目制作占位符:

-(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;
    }
}

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

-(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;
        }
}
于 2013-06-02T22:51:05.957 回答
2

你可以简单地创建一个类,如下所示:

 @interface MYNActivityProvider : UIActivityItemProvider <UIActivityItemSource>

 @end

// 执行

 - (id) activityViewController:(UIActivityViewController *)activityViewController
      itemForActivityType:(NSString *)activityType
 { 
    if ( [activityType isEqualToString:UIActivityTypePostToTwitter] ) {
        return stringToPost;
     }
    if ( [activityType isEqualToString:UIActivityTypePostToFacebook] ) {
         return stringToPost;
    }
    if ( [activityType isEqualToString:UIActivityTypeMessage] ) {
        return @"SMS message text";  
    }
    if ( [activityType isEqualToString:UIActivityTypeMail] ) {
        return @"Email text here!";
    }
    if ( [activityType isEqualToString:@"Custom"] ) {
        return @"app custom text";
    }
    return nil;
 }
于 2014-07-23T07:54:05.927 回答
0

您可能想尝试OvershareKit

我们经常被问到为什么有人会使用 OvershareKit 而不是 UIActivityViewController (UIAVC) 和 UIActivity。UIAVC 非常适合那些知道他们永远不需要以下任何内容的应用程序:

  1. 永远不需要与超过一两个第三方服务集成。
  2. 永远不需要调整活动表和共享屏幕的 UI。
  3. 从不关心为每种共享类型(电子邮件与 SMS 等)提供单独的、特定于媒体的内容
  4. 永远不需要在同一张表中有多个项目,例如复制文本与复制链接。
  5. 不要介意所有非系统提供的活动都会被无聊的单色图标卡住。

您的情况是(3) - 需要关心不同共享类型的不同内容。

于 2014-04-03T03:32:30.750 回答