Determine which share extension was used

2019-01-26 14:25发布

问题:

Since the completionHandler on UIActivityViewController was deprecated in iOS 8, is there any way to determine which share extension/activity was used by the user?

回答1:

You just need to use the new handler UIActivityViewControllerCompletionWithItemsHandler:

typedef void (^UIActivityViewControllerCompletionWithItemsHandler)(NSString *activityType, BOOL completed, NSArray *returnedItems, NSError *activityError);

Call it like this:

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

}];

Additionally, if you're wondering about knowing what item was selected, you just need to ensure your activity items conform to the UIActivityItemSource protocol;

UIActivityItemSource Protocol Documentation



回答2:

setCompletionWithItemsHandler is iOS8 only. If you need to support iOS6-7 then:

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

}];


回答3:

This is what we used in Swift:

    ...

    // Configure UIActivityViewController
    let activityViewController = UIActivityViewController(activityItems: objectsToShare, applicationActivities: nil)
    activityViewController.excludedActivityTypes = [UIActivityTypeAirDrop,
        UIActivityTypeAddToReadingList,
        UIActivityTypeAssignToContact,
        UIActivityTypePrint,
        UIActivityTypeCopyToPasteboard]

    // Show UIActivityViewController
    presentViewController(activityViewController, animated: true, completion: nil)

    // Define completion handler
    activityViewController.completionWithItemsHandler = doneSharingHandler

    ...

func doneSharingHandler(activityType: String?, completed: Bool, returnedItems: [AnyObject]?, error: NSError?) {
    // Return if cancelled
    if (!completed) {
        return
    }

    // If here, log which activity occurred
    println("Shared video activity: \(activityType)")
}