UIActivityViewController - 有没有办法知道选择了哪个活动?

Posted

技术标签:

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

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

【问题讨论】:

总是很高兴看到我要问的问题。 【参考方案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。不要使用这个库。

以上是关于UIActivityViewController - 有没有办法知道选择了哪个活动?的主要内容,如果未能解决你的问题,请参考以下文章

UIActivityViewController 背景颜色

UIActivityViewController 共享 UIActivity 未显示

UIActivityViewController 不适用于 WKWebView

限制 UIActivityViewController 共享扩展活动

尝试呈现 UIActivityViewController 时崩溃

更改 UIActivityViewController 的 navigationBar 的颜色