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://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;
   }
}
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市贫贝,隨后出現(xiàn)的幾起案子秉犹,更是在濱河造成了極大的恐慌蛉谜,老刑警劉巖,帶你破解...
    沈念sama閱讀 206,839評論 6 482
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件崇堵,死亡現(xiàn)場離奇詭異型诚,居然都是意外死亡,警方通過查閱死者的電腦和手機鸳劳,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,543評論 2 382
  • 文/潘曉璐 我一進店門狰贯,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人赏廓,你說我怎么就攤上這事涵紊。” “怎么了幔摸?”我有些...
    開封第一講書人閱讀 153,116評論 0 344
  • 文/不壞的土叔 我叫張陵摸柄,是天一觀的道長。 經(jīng)常有香客問我抚太,道長塘幅,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 55,371評論 1 279
  • 正文 為了忘掉前任尿贫,我火速辦了婚禮电媳,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘庆亡。我一直安慰自己匾乓,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 64,384評論 5 374
  • 文/花漫 我一把揭開白布又谋。 她就那樣靜靜地躺著拼缝,像睡著了一般。 火紅的嫁衣襯著肌膚如雪彰亥。 梳的紋絲不亂的頭發(fā)上咧七,一...
    開封第一講書人閱讀 49,111評論 1 285
  • 那天,我揣著相機與錄音任斋,去河邊找鬼继阻。 笑死,一個胖子當(dāng)著我的面吹牛废酷,可吹牛的內(nèi)容都是我干的瘟檩。 我是一名探鬼主播,決...
    沈念sama閱讀 38,416評論 3 400
  • 文/蒼蘭香墨 我猛地睜開眼澈蟆,長吁一口氣:“原來是場噩夢啊……” “哼墨辛!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起趴俘,我...
    開封第一講書人閱讀 37,053評論 0 259
  • 序言:老撾萬榮一對情侶失蹤睹簇,失蹤者是張志新(化名)和其女友劉穎奏赘,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體带膀,經(jīng)...
    沈念sama閱讀 43,558評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡志珍,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,007評論 2 325
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了垛叨。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 38,117評論 1 334
  • 序言:一個原本活蹦亂跳的男人離奇死亡柜某,死狀恐怖嗽元,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情喂击,我是刑警寧澤剂癌,帶...
    沈念sama閱讀 33,756評論 4 324
  • 正文 年R本政府宣布,位于F島的核電站翰绊,受9級特大地震影響佩谷,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜监嗜,卻給世界環(huán)境...
    茶點故事閱讀 39,324評論 3 307
  • 文/蒙蒙 一谐檀、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧裁奇,春花似錦桐猬、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,315評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至音五,卻和暖如春惫撰,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背躺涝。 一陣腳步聲響...
    開封第一講書人閱讀 31,539評論 1 262
  • 我被黑心中介騙來泰國打工厨钻, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人诞挨。 一個月前我還...
    沈念sama閱讀 45,578評論 2 355
  • 正文 我出身青樓莉撇,卻偏偏與公主長得像,于是被迫代替她去往敵國和親惶傻。 傳聞我的和親對象是個殘疾皇子棍郎,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 42,877評論 2 345

推薦閱讀更多精彩內(nèi)容

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