Reputation: 16094
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
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
Reputation: 2096
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.
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