今天想把社交分享的功能完成,但由于孤陋寡聞沒(méi)聽(tīng)說(shuō)過(guò)這個(gè)類(lèi),搜索了幾個(gè)幾年前的第三方庫(kù)來(lái)完成這個(gè)功能,甚至還花了大半個(gè)小時(shí)在源代碼里看別人怎么實(shí)現(xiàn)的,還沒(méi)瞧出來(lái)的時(shí)候搜索到了 UIActivityViewController,要是有人提點(diǎn)就不用花費(fèi)這么長(zhǎng)時(shí)間了。不過(guò)話也說(shuō)回來(lái),搜索的關(guān)鍵字精準(zhǔn)度不高,我用的是 iOS 8 social share api??偹阏业搅寺?,以后得注意學(xué)習(xí)下專(zhuān)業(yè)術(shù)語(yǔ),不然有 google 也不會(huì)用。另外,寫(xiě)這篇文章來(lái)記錄的時(shí)候也發(fā)現(xiàn)還有 Social 框架專(zhuān)用于社交媒體分享;去年 iOS 8 的一個(gè)重大的新功能擴(kuò)展(EXtension)也支持分享功能。最近學(xué)習(xí) WWDC 和 Swift,越發(fā)覺(jué)得 iOS8 是個(gè)非常重大的版本更新,特別是對(duì)開(kāi)發(fā)者,可惜,我到現(xiàn)在也沒(méi)接觸過(guò)多少。今天先講UIActivityViewController吧。
UIActivityViewController 使用起來(lái)非常簡(jiǎn)單,可分享的去處多了去了,需要我們寫(xiě)的也沒(méi)有幾行代碼,蘋(píng)果已經(jīng)完成了大部分的底層代碼。不過(guò),我也注意到?jīng)]法集成 Facebook 和 twitter,搜索發(fā)現(xiàn)這個(gè)問(wèn)題很普遍而且至今沒(méi)有得到有效解決,看這里:No FB and TW share icon on iOS 7, 最新的回答表示在 iOS 8.3 上也沒(méi)有解決,即使在真機(jī)上設(shè)置好了相關(guān)帳號(hào)。但是,Photos 里是可以用的,即使沒(méi)有設(shè)置帳號(hào)也會(huì)進(jìn)一步提示設(shè)置帳號(hào)。蘋(píng)果,你又不厚道了,好東西都自己留著,扔個(gè)閹割版出來(lái)給開(kāi)發(fā)者。
示例:
最簡(jiǎn)單的配置只需要設(shè)置好需要分享的數(shù)據(jù),可以是文本信息、圖像和鏈接,支持的服務(wù)都會(huì)提供。
NSString *info = @"share test";
UIImage *image=[UIImage imageNamed:@"UIBarButtonItemGrid.png"];
NSURL *url = [NSURL URLWithString:@"http://www.google.com"];
NSArray *postItems=@[info, image, url];
UIActivityViewController *controller = [[UIActivityViewController alloc] initWithActivityItems:postItems applicationActivities:nil];
//controller.excludedActivityTypes = @[UIActivityTypePostToFacebook];
//if iPhone
if (UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPhone) {
[self presentViewController:controller animated:YES completion:nil];
}
//if iPad
else {
// Change Rect to position Popover
UIBarButtonItem *shareBarButtonItem = self.navigationItem.leftBarButtonItem;
UIPopoverController *popup = [[UIPopoverController alloc] initWithContentViewController:controller];
[popup presentPopoverFromBarButtonItem:shareBarButtonItem permittedArrowDirections:UIPopoverArrowDirectionAny animated:YES];
}
進(jìn)階設(shè)置:
1.生成實(shí)例時(shí)提供一組 UIActivity 對(duì)象來(lái)提供自定義的服務(wù)。
2.配置 completionWithItemsHandler 屬性使得完成了操作或是取消操作后執(zhí)行其他收尾動(dòng)作。
3.配置 excludedActivityTypes 來(lái)指定不需要提供的操作。
在 iPad 上UIActivityViewController 以 popover 的方式顯示(但顯然蘋(píng)果有更好的顯示方式,Modal 模式,看 Photos 里的頁(yè)面,不厚道+1),不然會(huì)有運(yùn)行時(shí)錯(cuò)誤:UIActivityViewController crashing on iOS8 iPads。在 iOS 8 里UIActivityViewController 的這種顯示方式是以新類(lèi)UIPopoverPresentation Controller 為基礎(chǔ)的。popover 方式需要一個(gè)掛靠點(diǎn), UIPopoverPresentationController支持三種方式來(lái)設(shè)置掛靠點(diǎn):
1.barButtonItem
2.sourceView
3.sourceRect
NSHipster 上這篇文章對(duì) UIActivityViewController 解析得很深入:社交分享只是小試牛刀而已,該類(lèi)的真正用處是為不同服務(wù)提供數(shù)據(jù)傳輸。