iOS原生分享【UIActivityViewController】

這篇博客真的拖了好久好久累榜。這段時間被各種事情纏身(借口)。終于富弦,能夠好好整理一下最近的工作沟娱。切入正題,這次要講的是在iOS客戶端不使用第三方框架的前提下腕柜,實(shí)現(xiàn)分享的功能济似。該功能前人也造了很多輪子,本篇博客主要是結(jié)合自己在開發(fā)中遇到的一些情況對這個功能做個總結(jié)盏缤,與大家一起探討碱屁。


簡介

目前,我們用到的app幾乎每一個都包含了分享的功能蛾找。實(shí)際開發(fā)中娩脾,大部分情況下使用都是基于第三方,如shareSDK,友盟等平臺實(shí)現(xiàn)社交分享功能打毛。使用第三方平臺的可定制性高柿赊,但需要到每個平臺去注冊應(yīng)用申請key并且引入API就很繁瑣。相對而言幻枉,系統(tǒng)分享就簡易了很多碰声。

一、分享的內(nèi)容

分享的內(nèi)容可以是文字熬甫、圖片胰挑、視頻甚至是GIF。當(dāng)然有些平臺有限制椿肩。比如瞻颂,微信朋友圈和微博是分享不了GIF和視頻的。需要分享的內(nèi)容實(shí)體放在一個數(shù)組里,下面一一介紹郑象。

1. 圖片+文字

- (void)shareImage
{
    NSString *textToShare = self.titleTextField.text;
 // load你要分享的圖片贡这,通過bundle或者沙盒,或者name
    UIImage *imageToShare = [UIImage xxxx];
    [self shareWithActivityItems: @[textToShare, imageToShare]];
}

2. 視頻+文字

此處分享的是本地視頻厂榛,self.moviePath是本地視頻沙盒路徑盖矫。上效果圖丽惭。

視頻分享彈窗.png

- (void)shareVideo
{
    NSString *textToShare = self.titleTextField.text;
    NSURL *urlToShare = [NSURL fileURLWithPath:self.moviePath];
    [self shareWithActivityItems: @[textToShare,urlToShare]];
}

3. GIF+文字

這種類型的例子真的太少了。造好了輪子辈双,分享到微信成功责掏,見證奇跡的時刻了。不料湃望,打開卻是靜圖换衬。排查了各種原因,也嘗試了其他造輪子的方法喜爷。終于得出是因?yàn)? 圖片太大了冗疮。合成GIF的時候,沒有對圖片進(jìn)行處理檩帐,圖片過大導(dǎo)致分享出去打開是靜圖而在PC端可以正常打開术幔。

- (void)shareGIF
{
    NSString *textToShare = self.titleTextField.text;
    NSURL *urlToShare = [NSURL fileURLWithPath:self.gifPath];
    [self shareWithActivityItems: @[textToShare,urlToShare]];
}

二、彈出分享框

很明顯上面的shareWithActivityItems()就是彈出分享框的方法了湃密。具體如下诅挑。

- (void)shareWithActivityItems:(NSArray *)activityItems
{
    UIActivityViewController *activityVC = [[UIActivityViewController alloc]initWithActivityItems:activityItems applicationActivities:[self setupActivityWithActivityItems:activityItems]];
    // 根據(jù)需要指定不需要分享的平臺
    activityVC.excludedActivityTypes = @[UIActivityTypeMail,UIActivityTypePostToTwitter,UIActivityTypeMessage,UIActivityTypePrint,UIActivityTypeCopyToPasteboard,UIActivityTypeAssignToContact,UIActivityTypeAddToReadingList,UIActivityTypePostToFlickr,UIActivityTypePostToVimeo,UIActivityTypePostToTencentWeibo,UIActivityTypeAirDrop,UIActivityTypeOpenInIBooks];
    // >=iOS8.0系統(tǒng)用這個方法
    activityVC.completionWithItemsHandler = ^(NSString *activityType,BOOL completed,NSArray *returnedItems,NSError *activityError)
    {
        if (completed) { // 確定分享
        }
        else {
        }
    };
    [self presentViewController:activityVC animated:YES completion:nil];
}

三、選擇分享的平臺

一般情況下泛源,系統(tǒng)分享會列出手機(jī)上能夠支持該分享內(nèi)容的平臺拔妥。如微信,QQ达箍,新浪微博没龙,等等。當(dāng)然你也可以在更多里邊進(jìn)行控制這些平臺的展示與否缎玫。如圖硬纤,來自簡書中包含的系統(tǒng)分享。


系統(tǒng)分享彈窗.PNG

可以看到有兩行顯示赃磨,分別表示分享和操作筝家。當(dāng)然,你可以指定邻辉。綜上溪王,就可以完成分享的功能了。如果您需要自定義分享的平臺值骇,您可以往下看莹菱。

typedef NS_ENUM(NSInteger, UIActivityCategory) {
    UIActivityCategoryAction,
    UIActivityCategoryShare,
} NS_ENUM_AVAILABLE_IOS(7_0) __TVOS_PROHIBITED;

四、自定義UIActivity

官方文檔解釋雷客,UIActivity必須通過繼承的方式來使用芒珠。大概步驟,網(wǎng)上還是很多輪子的搅裙。這里主要講解一下細(xì)節(jié)部分皱卓。

- (void)performActivity
{
     if([self.type isEqualToString:ActivityServiceFackBook]) { 
        if([SLComposeViewController isAvailableForServiceType:SLServiceTypeFacebook]) {
            SLComposeViewController *composeVC = [SLComposeViewController composeViewControllerForServiceType:kShareFaceBook];
            [self shareActionWithVC:composeVC ShareType:self.type];
            [self.currentViewController presentViewController:composeVC animated:NO completion:nil];
        }
        else {
            [self showErrorText:@"沒有安裝FaceBook"];
        }
    }
    [self activityDidFinish:YES];
}

(void)performActivity調(diào)用這個方法執(zhí)行具體的服務(wù)操作。比如部逮,你自定義微信和新浪這服務(wù)娜汁。當(dāng)你點(diǎn)擊自定義服務(wù)的時候,會調(diào)用這個方法兄朋。所以你需要這個方法里判斷你點(diǎn)擊的具體服務(wù)是什么掐禁。前面我代碼中演示的是點(diǎn)擊facebook的例子。

如果自定義的服務(wù)實(shí)現(xiàn)分享視頻颅和。你可以按照以下操作傅事。

- (void)shareActionWithVC:(SLComposeViewController *)composeVC
{
    // self.shareContexts 是在彈出分享框的時候傳入的,可以參照上面的代碼
    for (id obj in self.shareContexts) {
       if ([obj isKindOfClass:[NSURL class]]) { // 視頻
            NSURL *urlToShare = (NSURL *)obj;
            if(urlToShare.absoluteString.length >0) { // 有視頻
                [composeVC addURL:urlToShare];
            }
        }
}

綜上峡扩,您就可以實(shí)現(xiàn)系統(tǒng)分享的功能了蹭越。歡迎討論。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末教届,一起剝皮案震驚了整個濱河市响鹃,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌案训,老刑警劉巖买置,帶你破解...
    沈念sama閱讀 207,113評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異强霎,居然都是意外死亡忿项,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,644評論 2 381
  • 文/潘曉璐 我一進(jìn)店門城舞,熙熙樓的掌柜王于貴愁眉苦臉地迎上來轩触,“玉大人,你說我怎么就攤上這事椿争∨绿牛” “怎么了?”我有些...
    開封第一講書人閱讀 153,340評論 0 344
  • 文/不壞的土叔 我叫張陵秦踪,是天一觀的道長褐捻。 經(jīng)常有香客問我,道長椅邓,這世上最難降的妖魔是什么柠逞? 我笑而不...
    開封第一講書人閱讀 55,449評論 1 279
  • 正文 為了忘掉前任,我火速辦了婚禮景馁,結(jié)果婚禮上板壮,老公的妹妹穿的比我還像新娘。我一直安慰自己合住,他們只是感情好绰精,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,445評論 5 374
  • 文/花漫 我一把揭開白布撒璧。 她就那樣靜靜地躺著,像睡著了一般笨使。 火紅的嫁衣襯著肌膚如雪卿樱。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,166評論 1 284
  • 那天硫椰,我揣著相機(jī)與錄音繁调,去河邊找鬼。 笑死靶草,一個胖子當(dāng)著我的面吹牛蹄胰,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播奕翔,決...
    沈念sama閱讀 38,442評論 3 401
  • 文/蒼蘭香墨 我猛地睜開眼裕寨,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了糠悯?” 一聲冷哼從身側(cè)響起帮坚,我...
    開封第一講書人閱讀 37,105評論 0 261
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎互艾,沒想到半個月后试和,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 43,601評論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡纫普,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,066評論 2 325
  • 正文 我和宋清朗相戀三年阅悍,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片昨稼。...
    茶點(diǎn)故事閱讀 38,161評論 1 334
  • 序言:一個原本活蹦亂跳的男人離奇死亡节视,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出假栓,到底是詐尸還是另有隱情寻行,我是刑警寧澤,帶...
    沈念sama閱讀 33,792評論 4 323
  • 正文 年R本政府宣布匾荆,位于F島的核電站拌蜘,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏牙丽。R本人自食惡果不足惜简卧,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,351評論 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望烤芦。 院中可真熱鬧举娩,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,352評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至骄噪,卻和暖如春尚困,著一層夾襖步出監(jiān)牢的瞬間蠢箩,已是汗流浹背链蕊。 一陣腳步聲響...
    開封第一講書人閱讀 31,584評論 1 261
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留谬泌,地道東北人滔韵。 一個月前我還...
    沈念sama閱讀 45,618評論 2 355
  • 正文 我出身青樓,卻偏偏與公主長得像掌实,于是被迫代替她去往敵國和親陪蜻。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,916評論 2 344

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