Napolux Napolux - 4 months ago 29
iOS Question

Customize URL for iOS sharing

It's pretty clear to me how to share a link with the iOS sharing activity... But I would like to customize the tracking in the url for different kind of shares, always using the same standard... Examples following...




Is it possible? How can I do it?


I solved in Objective-C by adding a custom UIActivityItemProvider:

#import "CustomUiActivityItemProvider.h"

@implementation CustomUiActivityItemProvider

- (id)initWithText:(NSString *)text{

    if ((self = [super initWithPlaceholderItem:text])) {
        self.text = text ?: @"";
        self.url = @"";
    return self;

- (id)item {
    NSString *activityType = self.activityType;

    if ([self.placeholderItem isKindOfClass:[NSString class]]) {

        if ([self.activityType isEqualToString:UIActivityTypePostToFacebook]) {
            self.url = [[NSString alloc] initWithFormat:@"%@&utm_source=facebook", self.text];
        } else if ([activityType isEqualToString:UIActivityTypePostToTwitter]) {
            self.url = [[NSString alloc] initWithFormat:@"%@&utm_source=twitter", self.text];
        } else if ([activityType isEqualToString:UIActivityTypeMessage]) {
            self.url = [[NSString alloc] initWithFormat:@"%@&utm_source=message", self.text];
        } else if([activityType isEqualToString:UIActivityTypeMail]){
            self.url = [[NSString alloc] initWithFormat:@"%@&utm_source=email", self.text];
        } else if ([activityType isEqualToString:UIActivityTypePostToWeibo]){
            self.url = [[NSString alloc] initWithFormat:@"%@&utm_source=weibo", self.text];
            self.url = [[NSString alloc] initWithFormat:@"%@&utm_source=other", self.text];

        return self.url;

    return self.placeholderItem;


And using it like this:

CustomUiActivityItemProvider *customProvider = [[CustomUiActivityItemProvider alloc] initWithText:urlString];

UIActivityViewController *activityVC = [[UIActivityViewController alloc] initWithActivityItems:@[customProvider]
activityVC.excludedActivityTypes = @[UIActivityTypePrint, UIActivityTypeCopyToPasteboard, UIActivityTypeAssignToContact, UIActivityTypeSaveToCameraRoll];
activityVC.completionHandler = ^(NSString *activityType, BOOL completed) {
 // CODE.... 
   [self presentViewController:activityVC animated:YES completion:nil];