社會化分享作為iOS開發(fā)的必備技能徒欣,這里做一個方案總結(jié)炼杖,本文只討論系統(tǒng)分享锋玲,不討論第三方的分享方案景用。
一. UIActivityViewController
簡介
UIActivityViewController是系統(tǒng)自帶的分享彈窗,支持AirDrop和很多系統(tǒng)級別的數(shù)據(jù)傳遞功能嫩絮,且自動判斷系統(tǒng)上可調(diào)用的App丛肢。蘋果已經(jīng)完成了大部分的底層代碼,暴露給開發(fā)者調(diào)用的API也很簡單剿干。界面效果如下:
可支持的分享數(shù)據(jù)類型:文本蜂怎,圖片,視頻置尔,鏈接杠步,文檔等。
優(yōu)點:代碼接入簡單榜轿,功能強大幽歼,使用簡單。
缺點:系統(tǒng)固定UI無法自定義谬盐,且彈出時間較慢甸私,一般需要1到2秒甚至更久的等待時間(系統(tǒng)需要做一些數(shù)據(jù)處理)。
使用說明
方法
- -(instancetype)initWithActivityItems:(NSArray *)activityItems applicationActivities:(nullable NSArray<__kindof UIActivity *> *)applicationActivities
屬性
- @property(nullable, nonatomic, copy) NSArray<UIActivityType> *excludedActivityTypes;
UIActivity代表服務(wù)對象飞傀,生成實例時提供一組UIActivity對象來提供自定義的服務(wù)皇型。
UIActivityViewController *activity = [[UIActivityViewController alloc] initWithActivityItems:@[] applicationActivities:nil];
UIPopoverPresentationController *popover = activity.popoverPresentationController;
if (popover) {
popover.sourceView = self.shareView;
popover.permittedArrowDirections = UIPopoverArrowDirectionUp;
}
[self presentViewController:activity animated:YES completion:NULL];
excludedActivityTypes 用于指定不需要提供的服務(wù),這個屬性是一個數(shù)組砸烦,代表的是弃鸦,如果我們不需要系統(tǒng)的某些服務(wù)就可以給它賦值, 這樣UIActivityViewController就不會顯示對應(yīng)的服務(wù)幢痘,系統(tǒng)提供了以下服務(wù):
UIActivityTypePostToFacebook
UIActivityTypePostToTwitter
UIActivityTypePostToWeibo
UIActivityTypeMessage
UIActivityTypeMail
UIActivityTypePrint
UIActivityTypeCopyToPasteboard
UIActivityTypeAssignToContact
UIActivityTypeSaveToCameraRoll
UIActivityTypeAddToReadingList
UIActivityTypePostToVimeo
UIActivityTypePostToTencentWeibo
UIActivityTypeAirDrop
UIActivityTypeOpenInIBooks
UIActivityTypeMarkupAsPDF
二.SLComposeViewController
很多時候唬格,產(chǎn)品為了UI效果,常常需要自己設(shè)計一套分享的界面颜说,比如知乎的分享界面购岗。
這種方式的優(yōu)點對于產(chǎn)品來說,可以實現(xiàn)路徑控制门粪。比如微信的分享就只能在其應(yīng)用內(nèi)分享藕畔,或者分享到騰訊的QQ,都是自家產(chǎn)品庄拇,不會將用戶引入到其他app中,算是一種產(chǎn)品流量的競爭手段吧。
代碼實現(xiàn)可以通過第三方分享措近,也可以調(diào)用系統(tǒng)的分享API溶弟。
優(yōu)點:調(diào)用迅速,不用等待瞭郑,立刻彈出辜御,且UI可定制。通常也會在界面里提供系統(tǒng)分享的入口屈张。
缺點:需要自己判斷手機上哪些app可以被分享擒权,代碼實現(xiàn)稍復(fù)雜。
使用說明
引入<Social/Social.h>框架
我們看一下SLComposeViewController類提供的API
屬性
- @property(nonatomic, readonly) NSString *serviceType //只 讀屬性 服務(wù)類型(比如微博阁谆,QQ碳抄,朋友圈等)
方法
- +(BOOL)isAvailableForServiceType:(NSString *)serviceType//該設(shè)備是否支持某項服務(wù)(比如支持分享到微信,如果設(shè)備未安裝微信或者微信沒有登錄賬號场绿,則返回NO)
- +(SLComposeViewController )composeViewControllerForServiceType:(NSString)serviceType//實例方法 傳入服務(wù)類型生成一個實例變量
- -(BOOL)setInitialText:(NSString *)text//分享的文字
- -(BOOL)addImage:(UIImage *)image//分享的圖片
- -(BOOL)addURL:(NSURL *)url//分享的鏈接
關(guān)于SLComposeViewController生成實例的方法剖效,需要注意的是iOS11.0之前,可以通過<Social/Social.h>框架提供的幾種枚舉類型來生成實例焰盗,這些枚舉類型在11.0之后被遺棄了璧尸。
SLServiceTypeTwitter
SLServiceTypeFacebook
SLServiceTypeSinaWeibo
SLServiceTypeTencentWeibo
SLServiceTypeLinkedIn
SLComposeViewController *composeVc =[SLComposeViewController composeViewControllerForServiceType:SLServiceTypeSinaWeibo];
那11之后如何生成SLComposeViewController的實例?這時候我們需要Share Extension熬拒。什么是Share Extension爷光?
在iOS 8的時候, 蘋果開放了幾個新特性, 其中一個就是Share Extension。它是蘋果系統(tǒng)自帶的社會化SDK澎粟。而SLComposeViewController支持調(diào)用所有的Share Extension蛀序。
以下是從網(wǎng)上找來的各個主流App的Share Extension
com.taobao.taobao4iphone.ShareExtension // 淘寶
com.apple.share.Flickr.post // Flickr
com.apple.share.SinaWeibo.post // 新浪微博
com.laiwang.DingTalk.ShareExtension // 釘釘
com.apple.mobileslideshow.StreamShareService // iCloud
com.alipay.iphoneclient.ExtensionSchemeShare // 支付寶
com.apple.share.Facebook.post // Facebook
com.apple.share.Twitter.post // Twitter
com.apple.Health.HealthShareExtension // 應(yīng)該是健康管理
com.tencent.xin.sharetimeline // 微信(好友、朋友圈捌议、收藏)
com.apple.share.TencentWeibo.post // 騰訊微博
com.tencent.mqq.ShareExtension // QQ
這樣哼拔,我們就可以通過調(diào)用ShareExtension來創(chuàng)建SLComposeViewController實例了。
SLComposeViewController *composeVC = [SLComposeViewController composeViewControllerForServiceType:@"com.tencent.xin.sharetimeline"]
// 預(yù)設(shè)文字
[composeVC setInitialText:@"分享咯"];
// 預(yù)設(shè)圖片
[composeVC addImage:[UIImage imageNamed:@"wxShareIcon"]];
// 網(wǎng)址
[composeVC addURL:[NSURL URLWithString:@"http://www.baidu.com"]];
[self presentViewController:composeVC animated:YES completion:nil];
其他
以上是關(guān)于社會化分享的方案總結(jié)瓣颅。而通常分享功能也常常會加入一些其他的功能層面倦逐,比如復(fù)制到剪切板,通過郵件分享等等宫补。這里也大概說一下檬姥。
UIPasteboard(剪切板)
關(guān)于類的簡單使用:
UIPasteboard*pasteboard = [UIPasteboard generalPasteboard]; pasteboard.string = @"剪切復(fù)制的文字";
想詳細了解剪切板使用的話,移步這篇文章:
http://www.reibang.com/p/a6d2e46329f8
MFMailComposeViewController(郵件分享)
使用說明
引入 <MessageUI/MessageUI.h>
我們看一下MFMailComposeViewController類提供的API
屬性
- @property (nonatomic, nullable, assign) id<MFMailComposeViewControllerDelegate> mailComposeDelegate//代理
方法
- +(BOOL)canSendMail//設(shè)備是否支持發(fā)送郵件(一般判斷是否已設(shè)置郵件賬戶)
- -(void)setSubject:(NSString *)subject//郵件主題
- -(void)setToRecipients:(nullable NSArray<NSString *> *)toRecipients//郵件接收賬戶 是個數(shù)組
- -(void)setCcRecipients:(nullable NSArray<NSString *> *)ccRecipients//添加抄送
- -(void)setBccRecipients:(nullable NSArray<NSString *> *)bccRecipients//添加密送
- -(void)setMessageBody:(NSString *)body isHTML:(BOOL)isHTML//郵件內(nèi)容 支持html屬性
- -(void)addAttachmentData:(NSData *)attachment mimeType:(NSString *)mimeType fileName:(NSString *)filename//添加附件 可以添加圖片粉怕,文檔等 先將附件轉(zhuǎn)成NSData格式傳入即可
if ([MFMailComposeViewController canSendMail]) { // 用戶已設(shè)置郵件賬戶
if ([MFMessageComposeViewController canSendText] == YES) {
_mailComposer = [[MFMailComposeViewController alloc]init];
_mailComposer.mailComposeDelegate = self;
// 設(shè)置郵件主題
[_mailComposer setSubject:@"文章"];
// 如使用HTML格式健民,則為以下代碼
NSString *bodyString = [NSString stringWithFormat:@"<span style='color:#999'>我使用印象筆記將這篇文章分享給你: </span> <a href='%@'> 點擊查看全文 </a>",self.shareUrl];
[_mailComposer setMessageBody:bodyString isHTML:YES];
[self presentViewController:_mailComposer animated:YES completion:nil];
}else{
[MBProgressHUD showError:@"設(shè)備不支持!"];
}
}else{
[MBProgressHUD showError:@"未設(shè)置郵件賬戶!"];
}
MFMailComposeViewController的代理方法
- -(void)mailComposeController:(MFMailComposeViewController *)controller didFinishWithResult:(MFMailComposeResult)result error:(nullable NSError *)error//用于監(jiān)聽郵件功能調(diào)起后的狀態(tài)
有四種枚舉值狀態(tài)
MFMailComposeResultCancelled
MFMailComposeResultSaved
MFMailComposeResultSent
MFMailComposeResultFailed
- (void)mailComposeController:(MFMailComposeViewController *)controller didFinishWithResult:(MFMailComposeResult)result error:(nullable NSError *)error{
[controller dismissViewControllerAnimated:YES completion:nil];
NSString *msg;
switch (result) {
case MFMailComposeResultCancelled:
msg = @"郵件發(fā)送取消";
break;
case MFMailComposeResultSaved:
msg = @"郵件保存成功";
break;
case MFMailComposeResultSent:
msg = @"郵件發(fā)送成功";
[MBProgressHUD showSuccess:msg];
break;
case MFMailComposeResultFailed:
msg = @"郵件發(fā)送失敗";
[MBProgressHUD showError:msg];
break;
default:
break;
}
}