napolux
napolux

Reputation: 16094

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...

Twitter:

http://www.example.com?utm_source=TWITTER&utm_medium=social&utm_campaign=socialbuttons&utm_content=app_android

Facebook:

http://www.example.com?utm_source=FACEBOOK&utm_medium=social&utm_campaign=socialbuttons&utm_content=app_android

Etc...

Is it possible? How can I do it?

Upvotes: 5

Views: 765

Answers (2)

napolux
napolux

Reputation: 16094

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];
        }else{
            self.url = [[NSString alloc] initWithFormat:@"%@&utm_source=other", self.text];
        }

        return self.url;
    }

    return self.placeholderItem;
}

@end

And using it like this:

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


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

Upvotes: 4

Gokul G
Gokul G

Reputation: 2096

  • To do this we gonna use UIActivityItemSource which act as the data provider for our UIActivityViewController.The documentation states as follows.

When implementing this protocol, your object becomes the data provider, providing the view controller with access to the items.

  • To know more about refer this documentation .
  • Create a NSObject class as follows and add it after your UIViewController class

    class shareDifferentUrl: NSObject, UIActivityItemSource {
    @objc func activityViewControllerPlaceholderItem(activityViewController: UIActivityViewController) -> AnyObject {
        return ""
    }
    
    @objc func activityViewController(activityViewController:  UIActivityViewController, itemForActivityType activityType: String) -> AnyObject? {
        if activityType == UIActivityTypePostToTwitter {
            return NSURL(string:"https://twitter.com/")
        } else if activityType == UIActivityTypePostToFacebook {
            return NSURL(string:"https://www.facebook.com/")
        }
        return nil
     }
    }
    
  • That's it now just add above class as activityItems of your UIActivityViewController

    @IBAction func share(sender: AnyObject) {
       let activityVC = UIActivityViewController(activityItems: [shareDifferentUrl()] as [AnyObject], applicationActivities: nil)
       self.navigationController?.presentViewController(activityVC, animated: true, completion: nil)
    }
    
  • Now we can able to share different url for twitter and fb

Upvotes: 2

Related Questions