【问题标题】:UIActivityViewController - is there a way to know which activity was selected?UIActivityViewController - 有没有办法知道选择了哪个活动?
【发布时间】:2013-01-04 00:38:29
【问题描述】:

我希望能够跟踪用户是否通过 facebook、twitter 等共享,但似乎无法知道选择了哪种方法。有没有?

【问题讨论】:

  • 总是很高兴看到我要问的问题。

标签: uiactivityviewcontroller


【解决方案1】:

您可以在 setCompletionHandler 中使用 Activity 类型

UIActivityViewController *activityVC = [[UIActivityViewController alloc]initWithActivityItems:activityItems applicationActivities:nil];

[activityVC setCompletionHandler:^(NSString *activityType, BOOL completed) {
    if([activityType isEqualToString: UIActivityTypeMail]){
        NSLog(@"Mail");
    }
    if([activityType isEqualToString: UIActivityTypePostToFacebook]){
        NSLog(@"Facebook");
    }

}];
[self presentViewController:activityVC animated:TRUE completion:nil];

系统内置支持的内置活动类型。

NSString *const UIActivityTypePostToFacebook;

NSString *const UIActivityTypePostToTwitter;

NSString *const UIActivityTypePostToWeibo;

NSString *const UIActivityTypeMessage;

NSString *const UIActivityTypeMail;

NSString *const UIActivityTypePrint;

NSString *const UIActivityTypeCopyToPasteboard;

NSString *const UIActivityTypeAssignToContact;

NSString *const UIActivityTypeSaveToCameraRoll;

针对 iOS 8 编辑

请注意,这将在 iOS 8 中生成编译器警告,您需要使用 setCompletionWithItemsHandler 方法而不是 setCompletionHandler 方法。

替换:

[activityVC setCompletionHandler:^(NSString *activityType, BOOL completed) {

与:

[activityVC setCompletionWithItemsHandler:^(NSString *activityType, BOOL completed,  NSArray *returnedItems, NSError *activityError) {

【讨论】:

  • 谢谢,这很有帮助!如果我需要知道他们事后选择了什么,这很好,但我也需要事先知道。例如,如果有人点击 twitter 按钮,我想显示与 Facebook 不同的消息
  • 您需要实现符合UIActivityItemSource 协议的自定义数据对象。然后,您可以以特定于活动类型的格式显示数据(或仅跟踪类型)。 NSHipster 有所有细节。
  • 只有邮件选项是显示??如何添加多个选项?
  • @Stela 如果您使用的是模拟器,则只会显示邮件选项。您需要在安装了 twitter、Facebook 等的设备上进行测试。
【解决方案2】:

在 Swift 4 中:

activityViewController.completionWithItemsHandler = { activity, success, items, error in
        if !success{
            print("cancelled")
            return
        }

        if activity == .postToTwitter {
            print("twitter")
        }

        if activity == .mail {
            print("mail")
        }
    }

【讨论】:

    【解决方案3】:

    迅速 3

    let activityViewController:UIActivityViewController = UIActivityViewController(activityItems: [screenCapture], applicationActivities: nil)
    activityViewController.excludedActivityTypes = [UIActivityType.print, UIActivityType.postToWeibo, UIActivityType.copyToPasteboard, UIActivityType.addToReadingList, UIActivityType.postToVimeo]
    
    activityViewController.completionWithItemsHandler = { activity, success, items, error in
        if !success{
            print("cancelled")
            return
        }
    
        if activity == UIActivityType.postToFacebook {
            print("facebook")
        }
    
        if activity == UIActivityType.mail {
            print("mail")
        }
    
    }
    
    self.present(activityViewController, animated: true, completion: nil)
    

    【讨论】:

      【解决方案4】:

      您可以使用这个库https://github.com/rdougan/RDActivityViewController 来识别哪些活动已被触及,并仅通过实现其协议来按活动返回自定义数据。

      像这样:

      - (NSArray *)activityViewController:(NSArray *)activityViewController itemsForActivityType:(NSString *)activityType
      {
          if ([activityType isEqualToString:UIActivityTypePostToTwitter]) {
              return @[@"Twitter text"];
          } else if ([activityType isEqualToString:UIActivityTypeMessage]) {
              return @[@"Message text"];
          } else if ([activityType isEqualToString:UIActivityTypeMail]) {
              return @[@"Mail text"];
          } else if ([activityType isEqualToString:UIActivityTypePostToFacebook]) {
              return @[@"Facebook text"];
          } else {
              return @[@"Default text"];
          }
      }
      

      希望对你有所帮助!

      【讨论】:

      • 刚刚因为这个协议调用而被我的应用程序拒绝了。显然它是一个私有 API。不要使用这个库。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-03
      • 1970-01-01
      • 1970-01-01
      • 2013-07-28
      • 1970-01-01
      相关资源
      最近更新 更多