有时我们需要调用系统自带分享,可以使用UIActivityViewController:
简单用法代码如下:
NSMutableArray *items = [[NSMutableArray alloc] init];
[items addObject:@"分享的title"];
[items addObject:[UIImage imageNamed:@"1"]];
[items addObject:@"https://www.baidu.com"];
UIActivityViewController *activityViewController = [[UIActivityViewController alloc] initWithActivityItems:items applicationActivities:nil];
//NSMutableArray *excludedActivityTypes = [NSMutableArray arrayWithArray:@[UIActivityTypeAirDrop, UIActivityTypeCopyToPasteboard, UIActivityTypeAssignToContact, UIActivityTypePrint, UIActivityTypeMail, UIActivityTypePostToTencentWeibo, UIActivityTypeSaveToCameraRoll, UIActivityTypeMessage, UIActivityTypePostToTwitter]];
//activityViewController.excludedActivityTypes = excludedActivityTypes;
[self presentViewController:activityViewController animated:YES completion:nil];
activityViewController.completionWithItemsHandler = ^(UIActivityType __nullable activityType, BOOL completed, NSArray * __nullable returnedItems, NSError * __nullable activityError){
NSLog(@"%@ ---- %@", activityType, returnedItems);
};
效果图:
将上面代码两行注释打开效果图:
现在我们要自定义第二行(More行)的显示,必须重写UIActivity,效果图:
UIActivityViewController
NS_CLASS_AVAILABLE_IOS(6_0) __TVOS_PROHIBITED @interface UIActivityViewController : UIViewController
可以看出UIActivityViewController是在iOS 6开始支持,且继UIViewController
初始化方法
- (instancetype)initWithActivityItems:(NSArray *)activityItems applicationActivities:(nullable NSArray<__kindof UIActivity *> *)applicationActivities
参数:
activityItems
:数组内的对象代表的是我们想要操作的数据的一些属性,而且这个数组至少需要一个值,比如我们PDF文档的名称,URL;
applicationActivities
:数组指定了泛型,数组内的对象必须是UIActivity
类型的对象,代表的是iOS系统支持的我们自定义的服务(后边有讲解)
UIActivityViewController
中如果不想显示某些系统自带分享功能,可以使用下面这个属性进行设置,数组中的UIActivityType
对象就是不显示的item功能
@property(nullable, nonatomic, copy) NSArray<UIActivityType> *excludedActivityTypes;
UIActivityType
类型有如下:
UIKIT_EXTERN UIActivityType const UIActivityTypePostToFacebook NS_AVAILABLE_IOS(6_0) __TVOS_PROHIBITED;
UIKIT_EXTERN UIActivityType const UIActivityTypePostToTwitter NS_AVAILABLE_IOS(6_0) __TVOS_PROHIBITED;
UIKIT_EXTERN UIActivityType const UIActivityTypePostToWeibo NS_AVAILABLE_IOS(6_0) __TVOS_PROHIBITED;
UIKIT_EXTERN UIActivityType const UIActivityTypeMessage NS_AVAILABLE_IOS(6_0) __TVOS_PROHIBITED;
UIKIT_EXTERN UIActivityType const UIActivityTypeMail NS_AVAILABLE_IOS(6_0) __TVOS_PROHIBITED;
UIKIT_EXTERN UIActivityType const UIActivityTypePrint NS_AVAILABLE_IOS(6_0) __TVOS_PROHIBITED;
UIKIT_EXTERN UIActivityType const UIActivityTypeCopyToPasteboard NS_AVAILABLE_IOS(6_0) __TVOS_PROHIBITED;
UIKIT_EXTERN UIActivityType const UIActivityTypeAssignToContact NS_AVAILABLE_IOS(6_0) __TVOS_PROHIBITED;
UIKIT_EXTERN UIActivityType const UIActivityTypeSaveToCameraRoll NS_AVAILABLE_IOS(6_0) __TVOS_PROHIBITED;
UIKIT_EXTERN UIActivityType const UIActivityTypeAddToReadingList NS_AVAILABLE_IOS(7_0) __TVOS_PROHIBITED;
UIKIT_EXTERN UIActivityType const UIActivityTypePostToFlickr NS_AVAILABLE_IOS(7_0) __TVOS_PROHIBITED;
UIKIT_EXTERN UIActivityType const UIActivityTypePostToVimeo NS_AVAILABLE_IOS(7_0) __TVOS_PROHIBITED;
UIKIT_EXTERN UIActivityType const UIActivityTypePostToTencentWeibo NS_AVAILABLE_IOS(7_0) __TVOS_PROHIBITED;
UIKIT_EXTERN UIActivityType const UIActivityTypeAirDrop NS_AVAILABLE_IOS(7_0) __TVOS_PROHIBITED;
UIKIT_EXTERN UIActivityType const UIActivityTypeOpenInIBooks
如果我们不想展示AirDrop功能,我们把UIActivityTypeAirDrop
添加到excludedActivityTypes
里面:
activityViewController.excludedActivityTypes = @[UIActivityTypeAirDrop];
自定义UIActivity对象
UIActivity类中的方法说明:
//分享类型,我们自定义UIActivity有多种类型,如分享微信、朋友圈、微博、QQ等,所以要指定类型,方便我们在performActivity事件中判断用户行为
- (nullable UIActivityType)activityType;
//显示的title
- (nullable NSString *)activityTitle;
//显示的图标
- (nullable UIImage *)activityImage;
//用户的行为事件捕获,可以根据activityTitle判断用户行为
- (void)performActivity;
//在用户选择展示在UIActivityViewController中的自定义服务的图标之后,调用自定义服务处理方法之前的准备工作,都需要在这个方法中指定,比如可以根据数据展示一个界面来获取用户指定的额外数据信息
- (void)prepareWithActivityItems:(NSArray *)activityItems;
//指定可以处理的数据类型,如果可以处理则返回YES
- (BOOL)canPerformWithActivityItems:(NSArray *)activityItems;
//UIActivityViewController中的服务分为了俩种,UIActivityCategoryAction和UIActivityCategoryShare,UIActivityCategoryAction表示在最下面一栏的操作型服务,比如Copy、Print;UIActivityCategoryShare表示在中间一栏的分享型服务,比如一些社交软件
+ (UIActivityCategory)activityCategory NS_AVAILABLE_IOS(7_0);
代码实现:
自定义UIActivity对象代码:
NSString * const ActivityServiceWeixin = @"weixin";
NSString * const ActivityServiceWeixinFriends = @"weixin_friends";
@interface HBShareBaseActivity : UIActivity
@property (nonatomic) NSString *title;
@property (nonatomic) NSString *type;
@property (nonatomic) NSString *urlString;
@property (nonatomic) NSString *shareDescription;
@property (nonatomic) NSString *shareTitle;
@property (nonatomic) UIImage *image;
- (instancetype)initWithTitle:(NSString *)title type:(NSString *)type;
@end
@implementation HBShareBaseActivity
- (instancetype)initWithTitle:(NSString *)title type:(NSString *)type{
if (self = [super init]) {
self.title = title;
self.type = type;
}
return self;
}
- (NSString *)activityTitle{
return self.title;
}
- (NSString *)activityType{
return self.type;
}
- (UIImage *)activityImage{
NSString *weixinImageString = @"ic_share_wechat";
NSString *friendsImageString = @"ic_share_circle";
NSString *imageName = [self.type isEqualToString:ActivityServiceWeixin] ? weixinImageString: friendsImageString;
NSData *imageData = [NSData dataWithBase64EncodedString:imageName];
return [UIImage imageWithData:imageData scale:2.0];
}
- (BOOL)canPerformWithActivityItems:(NSArray *)activityItems{
return YES;
}
- (void)prepareWithActivityItems:(NSArray *)activityItems
{
}
- (void)performActivity{
if ([self.type isEqualToString:ActivityServiceWeixin]) {
NSLog(@"在这里可以实现微信分享代码");
}else{
NSLog(@"在这里可以实现朋友圈分享代码");
}
}
@end
创建ShareTool类,继承自NSObject,使用自定义的HBShareBaseActivity类,代码实现如下:
@interface ShareTool : NSObject
- (void)shareWithTitle:(NSString *)title description:(NSString *)description url:(NSString *)url image:(UIImage *)image completionHandler:(UIActivityViewControllerCompletionHandler)completionHandler;
@end
@interface ShareTool()
@property (nonatomic, copy) UIActivityViewControllerCompletionHandler completionHandler;
@end
@implementation ShareTool
- (void)shareWithTitle:(NSString *)title description:(NSString *)description url:(NSString *)url image:(UIImage *)image completionHandler:(UIActivityViewControllerCompletionHandler)completionHandler
{
NSMutableArray *items = [[NSMutableArray alloc] init];
[items addObject:title?:@""];
if (image) {
[items addObject:image];
}
if (url) {
[items addObject:url];
}
NSMutableArray *activities = [[NSMutableArray alloc] init];
HBShareBaseActivity *weixinActivity = [[HBShareBaseActivity alloc] initWithTitle:@"微信" type:ActivityServiceWeixin];
HBShareBaseActivity *weixinFriendsActivity = [[HBShareBaseActivity alloc] initWithTitle:@"朋友圈" type:ActivityServiceWeixinFriends];
[@[weixinActivity, weixinFriendsActivity] enumerateObjectsUsingBlock:^(HBShareBaseActivity *activity, NSUInteger idx, BOOL *stop) {
activity.urlString = url;
activity.shareDescription = description;
activity.shareTitle = title;
activity.image = image;
}];
[activities addObjectsFromArray:@[weixinActivity, weixinFriendsActivity]];
UIActivityViewController *activityViewController = [[UIActivityViewController alloc] initWithActivityItems:items applicationActivities:activities];
NSMutableArray *excludedActivityTypes = [NSMutableArray arrayWithArray:@[UIActivityTypeAirDrop, UIActivityTypeCopyToPasteboard, UIActivityTypeAssignToContact, UIActivityTypePrint, UIActivityTypeMail, UIActivityTypePostToTencentWeibo, UIActivityTypeSaveToCameraRoll, UIActivityTypeMessage, UIActivityTypePostToTwitter]];
activityViewController.excludedActivityTypes = excludedActivityTypes;
AppDelegate *tempAppDelegate = (AppDelegate *)[[UIApplication sharedApplication] delegate];
[tempAppDelegate.window.rootViewController presentViewController:activityViewController animated:YES completion:nil];
activityViewController.completionHandler = ^(NSString *activityType, BOOL complted){
if (completionHandler) {
completionHandler(activityType, complted);
self.completionHandler = nil;
}
};
}
在ViewController中调用代码如下:
[[[ShareTool alloc] init] shareWithTitle:@"分享的title" description:@"描述信息" url:@"http://www.baidu.com" image:[UIImage imageNamed:@"1"] completionHandler:^(UIActivityType _Nullable activityType, BOOL completed) {
NSLog(@"%@ %d", activityType, completed);
}];
补充:
在UIActivityViewController中给用户展示的服务的图标activityImage
。关于这里的图标,有非常严格的限制:
- 首先是图标的背景色,这里推荐最好的完全透明的背景色;
官方文档中是这么解释的:"The alpha channel of the image is used as a mask to generate the final image that is presented to the user. Any color data in the image itself is ignored. Opaque pixels have a gradient applied to them and this gradient is then laid on top of a standard background. Thus, a completely opaque image would yield a gradient filled rectangle",
意思大概是,在这里颜色数据会被忽略,而透明图层会被当做mask(蒙版图层),不透明的图片会显示成渐进色填充。 -
其次是图标的尺寸,在不同的设备需要不同的尺寸,因此需要准备一套图标。
因此上面代码中图片地址:
NSString *weixinImageString = @"ic_share_wechat";
NSString *friendsImageString = @"ic_share_circle";
可以改成下面图片地址(有点长):
NSString *weixinImageString = @"iVBORw0KGgoAAAANSUhEUgAAAHgAAAB4CAYAAAA5ZDbSAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAA2ZpVFh0WE1MOmNvbS5hZG9iZS54bXAAAAAAADw/eHBhY2tldCBiZWdpbj0i77u/IiBpZD0iVzVNME1wQ2VoaUh6cmVTek5UY3prYzlkIj8+IDx4OnhtcG1ldGEgeG1sbnM6eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9IkFkb2JlIFhNUCBDb3JlIDUuMy1jMDExIDY2LjE0NTY2MSwgMjAxMi8wMi8wNi0xNDo1NjoyNyAgICAgICAgIj4gPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4gPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIgeG1sbnM6eG1wTU09Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9tbS8iIHhtbG5zOnN0UmVmPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvc1R5cGUvUmVzb3VyY2VSZWYjIiB4bWxuczp4bXA9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC8iIHhtcE1NOk9yaWdpbmFsRG9jdW1lbnRJRD0ieG1wLmRpZDo4M0FENzkyMUYwNUJFMzExQjM1RkRBMzFGNDZFOTMyQSIgeG1wTU06RG9jdW1lbnRJRD0ieG1wLmRpZDowQjc4MzgxMjVFNDExMUUzQjMzMEFCMTkxMDhGOTAyRiIgeG1wTU06SW5zdGFuY2VJRD0ieG1wLmlpZDowQjc4MzgxMTVFNDExMUUzQjMzMEFCMTkxMDhGOTAyRiIgeG1wOkNyZWF0b3JUb29sPSJBZG9iZSBQaG90b3Nob3AgQ1M2IChXaW5kb3dzKSI+IDx4bXBNTTpEZXJpdmVkRnJvbSBzdFJlZjppbnN0YW5jZUlEPSJ4bXAuaWlkOkUwNTg3QTZFMDU1Q0UzMTFCMzVGREEzMUY0NkU5MzJBIiBzdFJlZjpkb2N1bWVudElEPSJ4bXAuZGlkOjgzQUQ3OTIxRjA1QkUzMTFCMzVGREEzMUY0NkU5MzJBIi8+IDwvcmRmOkRlc2NyaXB0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";
NSString *friendsImageString = @"iVBORw0KGgoAAAANSUhEUgAAAHgAAAB4CAYAAAA5ZDbSAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAA2ZpVFh0WE1MOmNvbS5hZG9iZS54bXAAAAAAADw/eHBhY2tldCBiZWdpbj0i77u/IiBpZD0iVzVNME1wQ2VoaUh6cmVTek5UY3prYzlkIj8+IDx4OnhtcG1ldGEgeG1sbnM6eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9IkFkb2JlIFhNUCBDb3JlIDUuMy1jMDExIDY2LjE0NTY2MSwgMjAxMi8wMi8wNi0xNDo1NjoyNyAgICAgICAgIj4gPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4gPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIgeG1sbnM6eG1wTU09Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9tbS8iIHhtbG5zOnN0UmVmPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvc1R5cGUvUmVzb3VyY2VSZWYjIiB4bWxuczp4bXA9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC8iIHhtcE1NOk9yaWdpbmFsRG9jdW1lbnRJRD0ieG1wLmRpZDo4M0FENzkyMUYwNUJFMzExQjM1RkRBMzFGNDZFOTMyQSIgeG1wTU06RG9jdW1lbnRJRD0ieG1wLmRpZDowQjc4MzgxNjVFNDExMUUzQjMzMEFCMTkxMDhGOTAyRiIgeG1wTU06SW5zdGFuY2VJRD0ieG1wLmlpZDowQjc4MzgxNTVFNDExMUUzQjMzMEFCMTkxMDhGOTAyRiIgeG1wOkNyZWF0b3JUb29sPSJBZG9iZSBQaG90b3Nob3AgQ1M2IChXaW5kb3dzKSI+IDx4bXBNTTpEZXJpdmVkRnJvbSBzdFJlZjppbnN0YW5jZUlEPSJ4bXAuaWlkOkUwNTg3QTZFMDU1Q0UzMTFCMzVGREEzMUY0NkU5MzJBIiBzdFJlZjpkb2N1bWVudElEPSJ4bXAuZGlkOjgzQUQ3OTIxRjA1QkUzMTFCMzVGREEzMUY0NkU5MzJBIi8+IDwvcmRmOkRlc2NyaXB0aW9uPiA8L3JkZjpSREY+IDwveDp4bXBtZXRhPiA8P3hwYWNrZXQgZW5kPSJyIj8+MYWBUAAACCBJREFUeNrsnXuIVUUcx+eqreamUqtlZGkPIkgpa+1hD7OHWmRFkfQgsgwsKCiCtKT/IiMiH/WHUfRPaSRoZWaamqYZ2pbQKoVmpmj0MHV97Kbr4/b7dX+D0+Gcu2fOmdlzds/3Cz/u+5658zkz8/v9Zs7cUrlcVlDnVRdUAQBDAAwBMATAEABDAAwBMABDAAwBMATAEABDAAwBMABDAAwBMATAEABDAAwBMATAAAwBMATAEABDAAwBMBRUt7wXsFQq2X7kFLJ6smFkQ8jOJRsoz/eS39xMtpdsO9lmsW/IviU75LL8WV+9Wcr75aMWgBnoS2Q3kNUkPNxhsq/J5pLNJ/u7owPu6F30cLLecv8HaZ01Kb6vO9lNZG+RLZfnemEMbn9dR/Yl2RqyzwVyK9lYsnWuOg+5fZZsFdlVAOxf/ck+lAofabRiDblFIG9xeMzuckLxGP0+2ekA7Ed3kW0kGxfRVWvIu8huJtvp2h0ge5DsRykLADvSSWQzxempa2M81pDZO76NbJ+D4/cJPK6TsrzWEaKQXAMmD7q3QHvKGBNVTMgbpLtu8VE0GZs/M5w8ALaEyy1npXi1tp61hrya7H6yYymK0qPKa6PE2z4NgO3gcmiyhGxoivBJQ15A9jiHpCmcrGqql7L2AeB4cLvSzTyyKx3EyBryO2QveCx2vZS5KwC3rVfJbnGYCNGQXyF704GTFSUeSqbmrjY5lZYXk/Cj7MHWCOSSxLJxPtMoVbTQ4jjHgyFU1nXaJUddc1+6meXp63VL5rH9UcmCuRqDg971rDw5XXnqoqeTneHx+zXkHsoupdnD8jj8G6YB8P9b7zV080A7HEpD7qbcpzRNPSSOFwCLLpfs0DKytTL+bSXboxzPzxqQeWowTkozSfjDXfXLeajYXKTayBngVOTMiNatT0SuaJ607ym3/LhWHtu+NlQg36oqKc3VHuLYf6TcxwsPOIa4kvaKuey9+PfrlOZiOQnSOFla3BPdmzXczAGL57zYw1fPIXs9xknTKvd1SnN+SLLC1sniFSF3Gt9d3DiYNNFDzDtDxZuYCNNjAt6Mg7dbHLsh0NXz6pL6TOs4Y8DLHIJlMFMcnPOTA4D3WiRG+hrfw+M956iXFBKwdH2HHME9SjbBYcf2hgG4Kcbxf1aV1SZadRJnl+U31hYR8AhHcHm+9w7X7gHZJLnf0sbxuQsfYHyWl+j+FHjPyCICft4BXI6Tr/XtplSx38guMN47WOLq4Puey6qes/SiB6f8/O9koyXMyUK75Pg6G8YnGs89nxry3iFFzGSdl+KzmyUjtd9zGaOW4/BarzGqsghQyRDxRQRc1qAiAj4r4ecapLVw1/eJ71A95LkWyX6tl8fjJX4+ucr3DChcHEw6kGDMXSLhBzsyv8oY6FP9Asfn9OONxuuTjLi5mjUV0cmyhTtbEgcaLj+3yTPgc4zj8+TE7UbLnmZR9iNFBHwkQXbKhFs2uknfgDnOHmdkp2ZbnpytRQQcJ4FgZqeCcNlWeQZ8sZRhfCA7ZR3OFRHwNovsVBhctoWeAXN482RIdsrWthUxDt4h4KLmUu+jAi4olUr8npURocZBz2XcKHH2QJn1uihFzF64MGlbxPOc3B8VA257AC5LQmZNCrisrUWcD94QcaYz3I0x4LKaPZexWnbKticoXAtuCMtOWcA1W/CkFHPAUWorO2Wj74qY6KhVJ6YLefOTfvJ8lEMVZpPlZzQqt0tVHxEnz8VsF8fPtYVzsujgzdRSv5KH99Djg/SYW+wKi9ztAeP+02R/qsolKmnEvcFUhz3Cav6thWvB0lp57XCN3B9k0XK1PWy04HIgZk2Sd56m3C8hmphlHWe66I4K8N/YlKDlRjlZDImvJNwjzpGNnlGVvTi+d/wz56mMKznrVpyk5WobE2jB2hj8cCPdyFOTfElJr6LVbx7WRZ+tks+XRsXBvL55kbTIJvGGzzde3y/Tfs3yerM8PiCv6cfB1/bJffO15naIxxMrFzvdURfNIdGIBB+9RFpvowpfNcHLZ66WrntFALJrBeFzznoKdrqr6EWVbIuFtlrOAAHL4Rjvq/WLx9/A66HPlJPoMulBMlcuANNZzlcWzEnw0TjhBy+K+5RsdztA1poj6c1cVG5eru7vLxBsnKzaCCcrzHgcrpExf4vys5MA2x/KWACPK/xPVARXzAQPLViL9/14V8Zlny35CeVgl9pO14KNljwjZktpMn5Go0ULm254765b8ozchaE5BMxX9y2NUZk7EwI2c9guIS9XIVsZA3A4ZPZI17dRoZtSAD4uEwquIK+NSqJgDA6vFI4peXnquhQhUlt557dlSnBHyjGZT8TRgYmP3Ci3e1US5CZxjJY6cLDCxEPBB5LSTAp5sSRo9uW1HnO92yxB5lbB+2iEXa3v4rIVndIcYgmZu2XeNW9sntOUuQcs4p1ieeveu8n+ctRFBzNQiyTrFQfybikLb3F8NO+V15F2fP9IVRbA6UXnLluOTmn2qwKZj/melOHjDlNrefSiAx51mK5Qlc3GknrR1bzhniHe9Uqy6zti/XaW/02Kmk1KInbq+BqkVoHMf6y1Kk0DQhedXhxS8abfvMno4RTfo7c+ulRudyj/l8f4bSCd6J/PtPg63WES/lwoxis16+S1Y+KB8xjO+2vwahJeo83Lhxpce8X4azsIXTQEwBAAAzAEwBAAQwAMATAEwBAAQwAMwBAAQwAMATAEwBAAQwAMwBAAQwAMATAEwBAAQwAMwBAAQwAMATDUvvpXgAEACfzxDCNW2HIAAAAASUVORK5CYII=";