【问题标题】:UIActivityViewController - Email and Twitter sharingUIActivityViewController - 电子邮件和 Twitter 共享
【发布时间】:2012-10-20 01:14:15
【问题描述】:

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

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

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

在电子邮件中,它显示:

"

测试 "

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

谢谢!

【问题讨论】:

    标签: ios email nsmutablearray ios6 uiactivity


    【解决方案1】:

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

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

    你的 UIActivityViewController 填充了一个主题。

    【讨论】:

    • 还有其他的key可以传入UIActivityViewController吗?
    • 我猜你可以使用以下内容:(UIActivity *)activity, (NSArray *) activityItems, (NSArray *) applicationActivities, (NSArray *) excludeActivityTypes, (NSString *) subject, (int) totalProviderCount , (BOOL) 使用BlackPopoverStyle。
    • 这合法吗?它没有记录在案。
    • @Ajay 是否可以根据这样的键为 Twitter 和 Facebook 设置值?就像对于 Twitter 使用带有主题标签和提及的短文本,但对于 FB 使用更长的版本?
    • 如果您决定使用它,请先检查您是否在 iOS 6 上运行。如果没有,使用新的 UIActivityItemSource 协议方法设置主题。
    【解决方案2】:

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

    activityViewController:subjectForActivityType:
    

    发布项目时,服务可能会提供单独的主题 字段和数据字段,例如电子邮件。实现这个方法 如果您希望为支持某个服务的服务提供主题字段。

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

    【讨论】:

      【解决方案3】:

      1 和 2:How do I set recipients for UIActivityViewController in iOS 6?

      虽然提供的两种方法都有点小技巧,尤其是第一种,但这是可能的。

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

      【讨论】:

      • 这个答案作为 UIActivityItemSource 协议如何工作的示例很有用,并且可以用于不同的活动类型,但我不建议按原样使用它 - 对 @ 的依赖987654326@ 以及这些方法被内部UIActivityViewController 代码调用的顺序是......以一种可怕的方式烘焙。如果他们碰巧改变了他们打电话给你的方式,这是一个打破下游的秘诀。
      • 您能说明一下您是如何使用它的吗?我想包含 Facebook 的图像/文本/url 等。我可以只使用 MYNActivityProvider *provider0 = [[MYNActivityProvider alloc]init]; UIActivityViewController *vc = [[UIActivityViewController alloc] initWithActivityItems:@[provider0] applicationActivities:nil]; - 当我尝试这个时 - 它只返回第一个文本项/没有 facebook / twitter 的图像。
      • @johndpope 抱歉,已经有一段时间了……看来你可能有一些比我当时更新的 api
      • @esp 你的答案是迄今为止我在这个主题上找到的最好的文档!顺便说一句,在 FB 中,如果我返回 URL,我会额外调用 itemForActivityType,它可以正常工作..
      【解决方案4】:

      你可以像下面这样简单地创建一个类:

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

      【讨论】:

        【解决方案5】:

        你可能想试试OvershareKit

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

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

        您的情况是 (3) - 需要针对不同的分享类型关注不同的内容。

        【讨论】:

        • 值得一提的是它只有iOS 7。
        • 这在积极开发中并不孤单,并且不适用于 9+
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-01-16
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多