和羞走,倚门回首,却把青梅嗅。
前言
公司最近的一个app要求实现微信的多图分享,这倒没啥,问题是产品拿着手机让我看别人家的app是怎么做的,要求和人家的一模一样,纳尼!
小眼一瞅,这不就是原生的分享嘛,于是开搞。
iOS原生分享只用到系统的一个类UIActivityViewController
,这个类很简单,如图:
先撇开里面的初始化方法不说,剩下的也就这一个属性
excludedActivityTypes
有点意思了。看注释就知道,这个数组里面的类型是不显示的,默认为空,默认都显示。就是说,点击分享的时候,不想显示的分享平台就加到这个数组里面。数组内容是个枚举,内容如下:
这里面的都是默认显示的,要是不想显示的话就加到上面的那个数组
excludedActivityTypes
里面。
下面是当时项目中的代码,只是做了一下简单的封装,小白可以参考一下:
/**
* 分享
* 多图分享,items里面直接放图片
* 分享链接
* NSString *textToShare = @"mq分享";
* UIImage *imageToShare = [UIImage imageNamed:@"imageName"];
* NSURL *urlToShare = [NSURL URLWithString:@"https://www.baidu.com"];
* NSArray *items = @[urlToShare,textToShare,imageToShare];
*/
+ (void)mq_share:(NSArray *)items target:(id)target success:(SucceessBlock)successBlock;
/** 分享 */
+ (void)mq_share:(NSArray *)items target:(id)target success:(SucceessBlock)successBlock {
if (items.count == 0 || target == nil) {
return;
}
UIActivityViewController *activityVC = [[UIActivityViewController alloc] initWithActivityItems:items applicationActivities:nil];
if (@available(iOS 11.0, *)) {//UIActivityTypeMarkupAsPDF是在iOS 11.0 之后才有的
activityVC.excludedActivityTypes = @[UIActivityTypeMessage,UIActivityTypeMail,UIActivityTypeOpenInIBooks,UIActivityTypeMarkupAsPDF];
} else if (@available(iOS 9.0, *)) {//UIActivityTypeOpenInIBooks是在iOS 9.0 之后才有的
activityVC.excludedActivityTypes = @[UIActivityTypeMessage,UIActivityTypeMail,UIActivityTypeOpenInIBooks];
}else {
activityVC.excludedActivityTypes = @[UIActivityTypeMessage,UIActivityTypeMail];
}
activityVC.completionWithItemsHandler = ^(UIActivityType _Nullable activityType, BOOL completed, NSArray * _Nullable returnedItems, NSError * _Nullable activityError) {
if (completed) {
MQLog(@">>>>>success");
if (successBlock) {
successBlock(YES, @"");
}
}else {
MQLog(@">>>>>faild");
if (successBlock) {
successBlock(NO, @"");
}
}
};
//这儿一定要做iPhone与iPad的判断,因为这儿只有iPhone可以present,iPad需pop,所以这儿actVC.popoverPresentationController.sourceView = self.view;在iPad下必须有,不然iPad会crash,self.view你可以换成任何view,你可以理解为弹出的窗需要找个依托。
UIViewController *vc = target;
if (UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPad) {
activityVC.popoverPresentationController.sourceView = vc.view;
[vc presentViewController:activityVC animated:YES completion:nil];
} else {
[vc presentViewController:activityVC animated:YES completion:nil];
}
}
总结
iOS原生分享优缺点
- 优点
1、API使用方便。
2、是系统集成的,使用的时候,不需要各个平台的appKey
以及配置URL Schemes
。
- 缺点
1、除了枚举之外的平台,分享面板上不能忽略。
2、微博多图分享的时候,分享结果只能显示一张图片,且是首张。
后记
我们的产品只是注重多图分享到微信,系统原生分享的我暂时了解这么多,有什么不对以及不完善的地方,多多留言,互相探讨,共同进步。