iOS系統(tǒng)分享方案總結(jié)

社會化分享作為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也很簡單。界面效果如下:

IMG_8105.JPG

可支持的分享數(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è)計一套分享的界面,比如知乎的分享界面。

Snip20171129_6.png

這種方式的優(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://m.itdecent.cn/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;
   }
}
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 1、禁止手機睡眠 [UIApplicationsharedApplication].idleTimerDisabl...
    小熱狗閱讀 995評論 0 2
  • 轉(zhuǎn)至元數(shù)據(jù)結(jié)尾創(chuàng)建: 董瀟偉,最新修改于: 十二月 23, 2016 轉(zhuǎn)至元數(shù)據(jù)起始第一章:isa和Class一....
    40c0490e5268閱讀 2,098評論 0 9
  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見模式的工具(例如配置管理,服務(wù)發(fā)現(xiàn),斷路器,智...
    卡卡羅2017閱讀 136,695評論 19 139
  • 今天,年廿九!轉(zhuǎn)眼間,34個廿九過去了!古人云三十而立,四十不惑,五十而知天命……鑒于職業(yè)原因,每天所見,所看,所...
    張弓DereK閱讀 411評論 6 1
  • 每個人都有他的難處,每個人都要支撐一片天地,你看著我好,我看著你好,廣告可以告訴你準確的答案,地鐵上的廣告,擠嗎?...
    糖二傻子閱讀 245評論 0 0

友情鏈接更多精彩內(nèi)容