和羞走,倚門回首,卻把青梅嗅。
前言
公司最近的一個app要求實現微信的多圖分享,這倒沒啥,問題是產品拿著手機讓我看別人家的app是怎么做的,要求和人家的一模一樣,納尼!
人家的app
小眼一瞅,這不就是原生的分享嘛,于是開搞。
iOS原生分享只用到系統的一個類UIActivityViewController
,這個類很簡單,如圖:
UIActivityViewController
先撇開里面的初始化方法不說,剩下的也就這一個屬性
excludedActivityTypes
有點意思了。excludedActivityTypes
看注釋就知道,這個數組里面的類型是不顯示的,默認為空,默認都顯示。就是說,點擊分享的時候,不想顯示的分享平臺就加到這個數組里面。數組內容是個枚舉,內容如下:
UIActivityType
這里面的都是默認顯示的,要是不想顯示的話就加到上面的那個數組
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、微博多圖分享的時候,分享結果只能顯示一張圖片,且是首張。
后記
我們的產品只是注重多圖分享到微信,系統原生分享的我暫時了解這么多,有什么不對以及不完善的地方,多多留言,互相探討,共同進步。