UIActivityViewController - 有方法可以知道选择了哪个活动吗?

54

我希望能够追踪用户是否通过Facebook、Twitter等分享了内容,但似乎无法确定使用了何种分享方式。有办法吗?


4
很高兴看到我打算提出的问题。 - Morkrom
4个回答

48

您可以在 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) {

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

34

在Swift 4中:

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

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

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

4

swift 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)

1
你可以使用这个库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"];
    }
}

我希望我已经帮助了你!

5
我的应用因为这个协议调用被拒绝了。显然这是一个私有的API。请不要使用这个库。 - L_Sonic

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接