AirDrop概覽
成都創(chuàng)新互聯(lián)堅(jiān)持“要么做到,要么別承諾”的工作理念,服務(wù)領(lǐng)域包括:做網(wǎng)站、網(wǎng)站制作、企業(yè)官網(wǎng)、英文網(wǎng)站、手機(jī)端網(wǎng)站、網(wǎng)站推廣等服務(wù),滿足客戶于互聯(lián)網(wǎng)時(shí)代的復(fù)興網(wǎng)站設(shè)計(jì)、移動(dòng)媒體設(shè)計(jì)的需求,幫助企業(yè)找到有效的互聯(lián)網(wǎng)解決方案。努力成為您成熟可靠的網(wǎng)絡(luò)建設(shè)合作伙伴!
AirDrop是iOS 7引入的一項(xiàng)新功能,iCloud同步功能允許在用戶的兩臺(tái)iOS設(shè)備之間分享照片和文檔,而AirDrop可以在不同用戶的iOS設(shè)備之間進(jìn)行照片和文檔的分享。
在iOS 7之前,iOS用戶主要依靠第三方app實(shí)現(xiàn)iOS設(shè)備間的文件和數(shù)據(jù)分享,在iOS 7中,該項(xiàng)新功能適用于所有iPhone 5、iPad 4、iPad mini以及第五代iPod touch設(shè)備。通過(guò)AirDrop,你可以與附近其他iOS app分享照片、視頻、通訊錄、URL、Passbook passes、App Store上的app列表、iTunes Store中的媒體列表以及地圖中的位置信息等等。
蘋果在iOS 7 SDK中集成了UIActivityViewController類,可以讓你很簡(jiǎn)單地就能把AirDrop功能整合進(jìn)app中。UIActivityViewController類封裝了文件分享功能的細(xì)節(jié)。你所需要的就是告知這個(gè)類你希望分享的內(nèi)容,以及處理的結(jié)果。在這個(gè)教程中,我們將會(huì)演示UIActivityViewController的使用方法,以及你該如何使用AirDrop來(lái)分享圖片/文檔。
AirDrop使用藍(lán)牙來(lái)掃描周圍的設(shè)備,當(dāng)兩臺(tái)設(shè)備通過(guò)藍(lán)牙建立起了連接,考慮到更快速的數(shù)據(jù)傳輸,它就會(huì)創(chuàng)建點(diǎn)對(duì)點(diǎn)的Wi-Fi網(wǎng)絡(luò)來(lái)連接兩部iOS 設(shè)備。但并不意味著為了使用AirDrop而需要把設(shè)備連接至Wi-Fi網(wǎng)絡(luò)。
比如你想在iPhone拍照類app中將照片分享給另一位iPhone設(shè)備,假如你在兩臺(tái)設(shè)備間啟動(dòng)了AirDrop,點(diǎn)擊屏幕左下角的分享按鈕就能實(shí)現(xiàn)不同用戶iOS 設(shè)備間的文件分享。當(dāng)屏幕處于關(guān)閉狀態(tài)時(shí),AirDrop為不可用,所以要確保文件接收方的設(shè)備處于打開狀態(tài),然后選擇設(shè)備進(jìn)行分享。在另一臺(tái)設(shè)備上,你會(huì)看到照片預(yù)覽和確認(rèn)要求。接收者可以接受或者拒絕接收文件。如果你選擇了接收,照片會(huì)被傳輸至你的iOS設(shè)備,并保存至相冊(cè)。
AirDrop并不僅僅適用于拍照類app,你也可以在大部分內(nèi)置的應(yīng)用中看到它,比如Contacts, iTunes, App Store, Safari以及其他應(yīng)用程序中。
下面我們來(lái)看看如何把AirDrop整合進(jìn)你的app。
UIActivityViewController簡(jiǎn)介快覽
可能有開發(fā)者會(huì)覺(jué)得在應(yīng)用中整合AirDrop比較麻煩,其實(shí)只需要數(shù)行代碼就能實(shí)現(xiàn),UIActivityViewController讓這個(gè)過(guò)程變得非常簡(jiǎn)單,因?yàn)锳irDrop是該類固定的一部分。
UIActivityViewController類是一個(gè)標(biāo)準(zhǔn)的view controller,提供了幾項(xiàng)標(biāo)準(zhǔn)的服務(wù),比如復(fù)制項(xiàng)目至剪貼板,把內(nèi)容分享至社交網(wǎng)站,以及通過(guò)Messages發(fā)送數(shù)據(jù)等等。在iOS 7 SDK中,UIActivityViewController類提供了內(nèi)置的AirDrop功能。
如果你有一些數(shù)據(jù)一批對(duì)象需要通過(guò)AirDrop進(jìn)行分享,你所需要的是通過(guò)對(duì)象數(shù)組初始化UIActivityViewController,并展示在屏幕上:
UIActivityViewController *controller = [[UIActivityViewController alloc] initWithActivityItems:objectsToShare applicationActivities:nil];
[self presentViewController:controller animated:YES completion:nil];
如上代碼所示,只需要兩行代碼,你就能通過(guò)AirDrop選項(xiàng)啟用activity view。當(dāng)檢測(cè)到周圍的設(shè)備時(shí),activity controller會(huì)自動(dòng)展示在設(shè)備上,并處理數(shù)據(jù)轉(zhuǎn)換(如果你選擇了該項(xiàng))。
根據(jù)需要,你可以拒絕特定的分享類型,也就是說(shuō),你可以通過(guò)排除所有的活動(dòng)僅展示通過(guò)AirDrop進(jìn)行分享。如下代碼所示:
UIActivityViewController *controller = [[UIActivityViewController alloc] initWithActivityItems:objectsToShare applicationActivities:nil];
NSArray *excludedActivities = @[UIActivityTypePostToTwitter, UIActivityTypePostToFacebook,
UIActivityTypePostToWeibo,
UIActivityTypeMessage, UIActivityTypeMail,
UIActivityTypePrint, UIActivityTypeCopyToPasteboard,
UIActivityTypeAssignToContact, UIActivityTypeSaveToCameraRoll,
UIActivityTypeAddToReadingList, UIActivityTypePostToFlickr,
UIActivityTypePostToVimeo, UIActivityTypePostToTencentWeibo];
controller.excludedActivityTypes = excludedActivities;
[self presentViewController:controller animated:YES completion:nil];
現(xiàn)在activity view controller僅展示AirDrop選項(xiàng):
你可以通過(guò)UIActivityViewController來(lái)分享不同的數(shù)據(jù)類型,包括NSString, UIImage以及NSURL。你不僅可以使用NSURL分享鏈接,也可以通過(guò)URL傳遞任何類型的文件。
在接收端,當(dāng)其他設(shè)備接收數(shù)據(jù)時(shí),它會(huì)基于數(shù)據(jù)類型自動(dòng)打來(lái)app。也就是說(shuō),如果傳送的是UIImage時(shí),被接收的圖片會(huì)展示在拍照類app中。當(dāng)傳遞的是PDF文件時(shí),其他設(shè)備會(huì)在Safari中打開它。如果你僅僅分享NSString object,數(shù)據(jù)將會(huì)被展示在Notes app中。
AirDrop Demo App介紹
現(xiàn)在我們創(chuàng)建一個(gè)AirDrop demo app來(lái)幫你更好地理解UIActivityViewController和AirDrop。這個(gè)示例app非常簡(jiǎn)單,當(dāng)首次啟動(dòng),你會(huì)看到羅列了幾個(gè)文件的表格視圖,包括圖片文件、PDF文件以及文本文件,你可以點(diǎn)擊文件并查看內(nèi)容。在content view中,會(huì)看到一個(gè)屏幕右上角有一個(gè)操作按鈕。點(diǎn)擊按鈕將啟用AirDrop選項(xiàng),并且你可以與周圍設(shè)備分享圖片或者文檔。
你可以從頭開始做這個(gè)app,但是為了節(jié)省時(shí)間,你可以下載這個(gè)項(xiàng)目模板來(lái)試驗(yàn)。打開Xcode project,你會(huì)發(fā)現(xiàn)下邊這個(gè)Storyboard:
這個(gè)示例app已經(jīng)執(zhí)行了ListTableViewController和DocumentViewController。如果編譯并運(yùn)行這個(gè)app,你會(huì)發(fā)現(xiàn)一個(gè)文件列表。點(diǎn)擊任何一個(gè)文件,圖片或者文檔內(nèi)容將會(huì)展示出來(lái)。但是分享按鈕并沒(méi)有被執(zhí)行,這也是我們將要討論的一點(diǎn)。
添加AirDrop功能
在工程模板中,ListTableViewController被用來(lái)在表格視圖中展示文件列表,而DocumentViewController則通過(guò)web view來(lái)展示文檔內(nèi)容。document view中的操作按鈕和DocumentViewController的share: method有關(guān)。該方法的實(shí)現(xiàn)如下所示:
- (IBAction)share:(id)sender {
NSURL *url = [self fileToURL:self.documentName];
NSArray *objectsToShare = @[url];
UIActivityViewController *controller = [[UIActivityViewController alloc] initWithActivityItems:objectsToShare applicationActivities:nil];
// Exclude all activities except AirDrop.
NSArray *excludedActivities = @[UIActivityTypePostToTwitter, UIActivityTypePostToFacebook,
UIActivityTypePostToWeibo,
UIActivityTypeMessage, UIActivityTypeMail,
UIActivityTypePrint, UIActivityTypeCopyToPasteboard,
UIActivityTypeAssignToContact, UIActivityTypeSaveToCameraRoll,
UIActivityTypeAddToReadingList, UIActivityTypePostToFlickr,
UIActivityTypePostToVimeo, UIActivityTypePostToTencentWeibo];
controller.excludedActivityTypes = excludedActivities;
// Present the controller
[self presentViewController:controller animated:YES completion:nil];
}
這個(gè)代碼非常熟悉,我們?cè)谧铋_始的時(shí)候已經(jīng)討論過(guò)了,它可以用來(lái)簡(jiǎn)單地創(chuàng)建UIActivityViewController,排除所有分享功能(AirDrop除外),并作為模態(tài)視圖展示出控制器。棘手的部分是如何定義分享的對(duì)象。下邊我們將會(huì)把分享文件轉(zhuǎn)換成NSURL object,并把文件URL作為數(shù)組傳遞給AirDrop。
頭兩行代碼是關(guān)于file URL轉(zhuǎn)換的。documentName屬性存儲(chǔ)了當(dāng)前文件(比如ios-game-kit-sample.pdf),展示在document view中。我們通過(guò)文檔名稱和它返回的相應(yīng)的file URL,來(lái)簡(jiǎn)單地調(diào)用fileToURL: method。fileToURL: method已經(jīng)在工程模板中,代碼如下:
- (NSURL *) fileToURL:(NSString*)filename
{
NSArray *fileComponents = [filename componentsSeparatedByString:@"."];
NSString *filePath = [[NSBundle mainBundle] pathForResource:[fileComponents objectAtIndex:0] ofType:[fileComponents objectAtIndex:1]];
return [NSURL fileURLWithPath:filePath];
}
這些代碼非常簡(jiǎn)潔明了,比如ios-game-kit-sample.pdf將會(huì)被轉(zhuǎn)換為
%20Support/iPhone%20Simulator/7.0.3/Applications/A5321493-318A-4A3B-8B37-E56B8B4405FC/AirDropDemo.app/ios-
game-kit-sample.pdf.
file URL依據(jù)你運(yùn)行的設(shè)備而變化,但是URL應(yīng)該以“file://”協(xié)議開頭。通過(guò)file URL object,我們創(chuàng)建了相應(yīng)的數(shù)組,并把它傳遞給UIActivityViewController以用來(lái)進(jìn)行AirDrop分享。
編譯并運(yùn)行AirDrop demo
做完這些后,編譯并在iPhone上運(yùn)行這個(gè)app。
注意:你需要一個(gè)真實(shí)的設(shè)備來(lái)測(cè)試AirDrop分享。不能在模擬器上進(jìn)行分享。
Uniform Type Identifiers (UTIs)統(tǒng)一標(biāo)示符(UTIs)
當(dāng)你把圖片分享之其他iOS設(shè)備,接收方會(huì)自動(dòng)打開拍照類app并加載圖片。如果你傳遞的是PDF文件,接收方設(shè)備可能會(huì)提示你選擇一個(gè)app來(lái)打開文件,或者直接在iBooks中打開。iOS是如何知道哪個(gè)app適合什么樣的數(shù)據(jù)類型呢?
在系統(tǒng)中,蘋果用UTIs來(lái)處理數(shù)據(jù)類型的標(biāo)示。簡(jiǎn)單的說(shuō),一個(gè)uti是用來(lái)標(biāo)示特定類型的數(shù)據(jù)或文件。例如,com.adobe.pdf標(biāo)示一個(gè)pdf文件,而public.png代表一個(gè)PNG圖片。在這里可以查看已經(jīng)在系統(tǒng)中注冊(cè)了的完整的UTIs清單。(love cc cat)應(yīng)用程序可以打開在iOS系統(tǒng)中已經(jīng)注冊(cè)了的UTI。因此無(wú)論文件是否被打開,iOS都會(huì)用特定的程序打開這個(gè)文件。
系統(tǒng)允許多個(gè)程序注冊(cè)相同的UTI。在這個(gè)教程中,iOS將通過(guò)app列表打開文件。比如,當(dāng)你分享PDF文檔時(shí),你可以在接收端設(shè)備上看到如下屏幕:
總結(jié)
AirDrop是iOS 7引入的一個(gè)非常酷的功能,它為iOS設(shè)備間數(shù)據(jù)分享提供了一個(gè)很好的方法。首先,內(nèi)置的UIActivityViewController類使得開發(fā)者在應(yīng)用中實(shí)現(xiàn)該功能變得非常簡(jiǎn)單。正如你所看到的demo app,它僅僅需要幾行代碼就能實(shí)現(xiàn)。所以推薦開發(fā)者在應(yīng)用中實(shí)現(xiàn)該功能。
1 UIFileSharingEnabled 設(shè)置為YES
并設(shè)置如下的格式告訴系統(tǒng)你能處理這個(gè)類型的文件
2 設(shè)置info.plist里添加可以讀取PDF功能 如圖所示
3 當(dāng)?shù)谌綉?yīng)用選擇你的程序后,回自動(dòng)觸發(fā)– application:openURL:sourceApplication:annotation:. 你要做的就是在該方法里實(shí)現(xiàn)打開這個(gè)PDF即可:
4 但如果你要打開自定義的文件格式則需要告訴系統(tǒng)你的自定義格式 UIExportedTypeDeclarations 并新增一個(gè)item 可能你會(huì)問(wèn)為什么PDF不用設(shè)置這個(gè),因?yàn)橄到y(tǒng)已經(jīng)默認(rèn)支持PDF所以不用在設(shè)置一個(gè)PDF對(duì)應(yīng)的UIExportedTypeDeclaration。 如圖所示
5 分享文件的屬性設(shè)置可以在這里查看
6 文件的復(fù)制、刪除,請(qǐng)看下面的這篇文章
在最近參與的項(xiàng)目過(guò)程中,我發(fā)現(xiàn)一個(gè)有趣的現(xiàn)象。國(guó)內(nèi)的App開發(fā)者,在設(shè)計(jì)“分享”這個(gè)功能的時(shí)候,一般都會(huì)根據(jù)業(yè)務(wù)的實(shí)際需要,設(shè)計(jì)一套自定義的解決方案,我們姑且稱之為“自定義分享插件”。而相比之下,國(guó)外的開發(fā)者更傾向于使用iOS提供的系統(tǒng)級(jí)的Share Extension,我們姑且稱之為“原生分享插件”。那么,這兩種方案,各有什么特色和優(yōu)缺點(diǎn)呢?
什么是原生分享插件?
我們先來(lái)簡(jiǎn)單看一下什么是蘋果的原生分享插件Share Extension。前面說(shuō)過(guò),由于中國(guó)App開發(fā)大量使用自定義的分享方式,所以可能很多設(shè)計(jì)師還不熟悉原生分享的機(jī)制。另外,蘋果直到去年的iOS8.0才重新定義了iOS的Extension機(jī)制,并重新設(shè)計(jì)了Share Extension,使得她真正變得好用而受到開發(fā)者的認(rèn)可。所以,原生分享插件對(duì)于我們來(lái)說(shuō),其實(shí)還挺新的:)
在早先版本里,從iOS5到iOS6,乃至iOS7,分享插件的界面設(shè)計(jì)進(jìn)過(guò)了幾次變更,但是功能上一直十分有限,一開始僅限于系統(tǒng)級(jí)和系統(tǒng)原生應(yīng)用的內(nèi)容傳遞,例如發(fā)送照片內(nèi)容到郵件和短信,或者從Safari保存網(wǎng)頁(yè)等。后來(lái)蘋果通過(guò)與Twitter和Facebook等幾家公司簽訂獨(dú)立的協(xié)議,實(shí)現(xiàn)了整合的方案,使內(nèi)容分享到這些應(yīng)用的過(guò)程更方便。
但是蘋果顯然也意識(shí)到了這一點(diǎn),即系統(tǒng)和應(yīng)用,以及應(yīng)用與應(yīng)用之間傳遞內(nèi)容信息的需求是用戶真實(shí)存在的需求,需要一個(gè)真正系統(tǒng)級(jí)的解決方案,就像當(dāng)年的Push Notification那樣,一個(gè)方案解決所有App的問(wèn)題,而不是一家一家地去簽協(xié)議。
所以,在去年的iOS8發(fā)布時(shí),蘋果對(duì)分享機(jī)制做了大刀闊斧的改變,這就是新的Share Extension,原生分享插件。App開發(fā)者只需要在開發(fā)過(guò)程中,為App加入原生分享插件,向系統(tǒng)注冊(cè),就可以通過(guò)Extension來(lái)實(shí)現(xiàn)與系統(tǒng)和其他App的內(nèi)容分享了。原生分享插件就相當(dāng)于一個(gè)中間媒介,可以接受Host App(發(fā)送內(nèi)容的App)提交的內(nèi)容,轉(zhuǎn)交給想要分享到的Containing App(接受內(nèi)容的App)。、
舉例來(lái)說(shuō),如果你開發(fā)的是一個(gè)電商類App,希望鼓勵(lì)用戶把App上的商品分享給他們的朋友或者社交媒體,那么通過(guò)掛載和注冊(cè)原生分享插件,以后用戶想要分享App上的內(nèi)容時(shí),喚出分享界面,就可以把內(nèi)容分享到系統(tǒng)上的任一(注冊(cè)了分享插件的)位置。相反,如果你開發(fā)的是一個(gè)社交App,并鼓勵(lì)用戶從其他內(nèi)容源分享內(nèi)容你的App,同樣需要注冊(cè)到分享插件,表明你同意接受由它發(fā)送來(lái)的內(nèi)容。
當(dāng)然,不同形式的內(nèi)容也不是隨便就到處傳遞的。無(wú)論你是發(fā)送內(nèi)容的Host App,還是接受內(nèi)容的Containing App,都需要向原生分享插件描述清楚,要發(fā)送或接受的內(nèi)容是什么格式,比如圖片視頻、文本還是鏈接。這被稱為Activation Rules。也就是說(shuō),假如用戶要分享的是一段文字,那么當(dāng)他點(diǎn)擊分享按鈕時(shí),彈出的Share Sheet上,就不會(huì)顯示Instagram和Pintrest這類App,因?yàn)樗麄冎唤邮軋D片分享。這也就是說(shuō),盡管是同一個(gè)原生分享組件,但是在不同的App上,它出現(xiàn)時(shí)顯示的內(nèi)容會(huì)自動(dòng)根據(jù)要分享出去的內(nèi)容性質(zhì)做出變化。
所以,iOS的Share Extension原生分享插件,就像一個(gè)巨大的內(nèi)容中轉(zhuǎn)站,在系統(tǒng)和App,以及App之間建立起關(guān)聯(lián),方便內(nèi)容的傳遞。
那么為什么要采用這樣一種集成式的設(shè)計(jì)思路,而不是鼓勵(lì)各App之間點(diǎn)對(duì)點(diǎn)傳輸呢?
最大的優(yōu)勢(shì)就是安全性和便利性。
iOS上的App被設(shè)計(jì)在一個(gè)“沙盒”里,App與系統(tǒng)間,以及App與另一個(gè)App之間的數(shù)據(jù)傳輸是受到嚴(yán)格限制的。所以我們經(jīng)常遇到App在使用相機(jī)、相冊(cè)或者GPS傳感器時(shí),都要請(qǐng)求用戶同意的場(chǎng)景。這樣設(shè)計(jì)的好處就是蘋果的設(shè)備安全系數(shù)很高,惡意軟件和病毒很難入侵。在這種情況下,如果系統(tǒng)允許App隨便傳遞內(nèi)容信息,肯定是不行的。App們互相之間如果要傳遞信息,也要先建立信任,也就是授權(quán)。所以在沒(méi)有原生分享插件的時(shí)候,每一次分享動(dòng)作,伴隨的都是可能要一次新的授權(quán)(如果你自定義分享插件,情況便是如此)。而原生分享插件,就是將這些授權(quán)全都集中起來(lái),由系統(tǒng)平臺(tái)一次完成(App向系統(tǒng)注冊(cè)時(shí))。這樣,iOS通過(guò)這種集成的方式,既能保證沙盒機(jī)制不被破壞,又實(shí)現(xiàn)了系統(tǒng)層面的信息分享。
當(dāng)App注冊(cè)了原生分享插件,一方面,它就可以通過(guò)插件向系統(tǒng)和其他所有(也注冊(cè)了分享插件)的App發(fā)送內(nèi)容,只要對(duì)方接受內(nèi)容的形式(圖片、文本等)。另一方面,它也同意接受來(lái)自插件的相應(yīng)內(nèi)容。這意味著,用戶在iOS設(shè)備上,從任意一個(gè)App分享內(nèi)容到其他任意一個(gè)App時(shí),都不用再額外進(jìn)行一個(gè)App之間的授權(quán)動(dòng)作了。分享真正變成系統(tǒng)級(jí)別的,無(wú)處不在的。
并且,這個(gè)方案的系統(tǒng)整合程度很高,意味著,在實(shí)際的交互場(chǎng)景中,用戶甚至可以不用跳轉(zhuǎn)到他要分享的那個(gè)App里去操作,而是直接在當(dāng)前界面完成分享,然后繼續(xù)該干嘛干嘛。
講完了這些,那么問(wèn)題來(lái)了:
既然蘋果的這套Share Extension機(jī)制這么好,為什么國(guó)內(nèi)的App們還偏要自定義分享插件呢?
最大的問(wèn)題在于,App的開發(fā)者想要分享內(nèi)容到甲乙丙,而原生分享插件顯示的是ABC。
蘋果在設(shè)計(jì)原生分享插件時(shí),是從所有用戶的習(xí)慣角度出發(fā)的,如果用戶經(jīng)常分享內(nèi)容到Facebook和Pintrest,而不常用Twitter,那么他可以通過(guò)Share的Action Sheet上的“更多”按鈕,進(jìn)入一個(gè)設(shè)置頁(yè)面,在那里調(diào)整分享到App的順序,甚至把不常用的分享渠道關(guān)掉。
這顯然不符合國(guó)內(nèi)一些開發(fā)者的口味,尤其是BAT這樣的大公司。微信就關(guān)閉了對(duì)原生分享的支持,而選擇了大量的自定義,所以我們可以看到微信的Share Sheet上出現(xiàn)了“收藏”、“調(diào)整字體”等跟分享毫無(wú)關(guān)系的功能。淘寶的分享也是自定義的。這類大公司的邏輯更多是讓分享內(nèi)容在自家的生態(tài)體系里流動(dòng),而不是整個(gè)平臺(tái)。
一個(gè)非常有意思的特例是Pintrest。這家公司在自己的App上也使用了自定義的分享插件,為了方便用戶把內(nèi)容分享給App內(nèi)的好友關(guān)系圈。但是如果在自定義的sheet上點(diǎn)擊表示“更多”的那個(gè)“…”紅色按鈕,這是App又會(huì)調(diào)出原生分享插件。真是既滿足了自己的小算盤,又照顧到了全平臺(tái)的用戶。而這樣做的副作用就是,如果用戶在第一個(gè)自定義Sheet上點(diǎn)擊分享到Facebook,則調(diào)用系統(tǒng)分享編輯界面,而如果用戶是在第二個(gè)原生分享sheet上點(diǎn)擊,則會(huì)跳轉(zhuǎn)到Facebook App里去做分享內(nèi)容編輯。
調(diào)用下面的方法即可實(shí)現(xiàn)系統(tǒng)分享功能
//分享
- (IBAction)RespostClick_Action:(id)sender {
UIImage* image = [UIImage imageNamed:@"icon_share.png"];
NSString *text = @"I found an Awesome application software! InstaDown";
//;ls=1mt=8
NSURL *urlToShare = [NSURL URLWithString:[NSString stringWithFormat:@";ls=1mt=8",[HHLADSManager getValueFromjsondata:@"appid"]]];
NSArray *activityItems = @[text,image,urlToShare];
UIActivityViewController *avc = [[UIActivityViewController alloc]initWithActivityItems:activityItems applicationActivities:nil];
[self presentViewController:avc animated:TRUE completion:nil];
// 選中分享類型
[avc setCompletionWithItemsHandler:^(NSString * __nullable activityType, BOOL completed, NSArray * __nullable returnedItems, NSError * __nullable activityError){
// 顯示選中的分享類型
NSLog(@"act type %@",activityType);
if (completed) {
NSLog(@"ok");
}else {
NSLog(@"no ok");
}
}];
UIPopoverPresentationController *popover = avc.popoverPresentationController;
if (popover) {
popover.sourceView = self.view;
popover.sourceRect = self.view.bounds;
popover.permittedArrowDirections = UIPopoverArrowDirectionUp;
}
}
這里主要講利用分享擴(kuò)展(share extension)實(shí)現(xiàn)系統(tǒng)分享到自己app的功能,擴(kuò)展里面跳轉(zhuǎn)宿主app,及數(shù)據(jù)傳輸?shù)?/p>
創(chuàng)建成功會(huì)生成一個(gè)文件夾
info.plist 里面有激活擴(kuò)展的規(guī)則,匹配規(guī)則會(huì)在系統(tǒng)分享里面出現(xiàn)自己的app。
NSExtensionActivationRule:默認(rèn)為字符串“TRUEPREDICATE”,表示在分享菜單中一直顯示該擴(kuò)展。生產(chǎn)環(huán)境不可用,必須將類型改為Dictionary類型,然后添加以下字段:
默認(rèn)分享擴(kuò)展類ShareViewController,自帶視圖,可以全部自定義,這里不講訴
跳轉(zhuǎn)宿主app后在一下方法中處理邏輯
-(BOOL)application:(UIApplication *)app openURL:(NSURL *)url options:(NSDictionaryUIApplicationOpenURLOptionsKey,id *)options;
首先要配置相同的 App Groups,必須group.開頭
NSUserDefaults *de = [[NSUserDefaults alloc]initWithSuiteName:@"group.(跟上面app groups一致)"];
[de setObject:value forKey:@"key"];
宿主app 獲取數(shù)據(jù)
NSUserDefaults *de = [[NSUserDefaults alloc]initWithSuiteName:@"group.(跟上面app groups一致)"];
id value = [de objectForKey:@"key"];
擴(kuò)展要選擇對(duì)應(yīng)宿主app運(yùn)行,但擴(kuò)展屬于獨(dú)立進(jìn)程,調(diào)試的時(shí)候運(yùn)行擴(kuò)展,宿主app里面的斷點(diǎn)不會(huì)走,同樣運(yùn)行宿主app,擴(kuò)展里面的斷點(diǎn)不會(huì)執(zhí)行
1.在 ShareSDK()的官方上下載 SDK 并導(dǎo)入工程 將 ShareSDK 文件夾到項(xiàng)目文件夾中夾并拖入項(xiàng)目中。
2. 添加依賴框架(Framework) 打開項(xiàng)目設(shè)置中的 Build Phases 頁(yè),在“Link Binary With Libraries”一欄中,點(diǎn)擊左下角的“+” 號(hào);在彈出窗口里面分別以下庫(kù)加入到項(xiàng)目中: SystemConfiguration.framework QuartzCore.framework MessageUI.framework libicucore.dylib
3.引入社區(qū)應(yīng)用配置信息。 打開 main.m 文件加入
#import
如圖:
(P.S. 此頭文件必須在此文件下導(dǎo)入,否則會(huì)導(dǎo)致編譯不通過(guò)) 4. 配置所有社交平臺(tái)的 AppKey 打開 ShareSDKConfig.h 文件,根據(jù)需求設(shè)置各個(gè)平臺(tái)的 App 相關(guān)信息(每個(gè)平臺(tái)的 App 都需要到相 應(yīng)平臺(tái)上進(jìn)行應(yīng)用登記后來(lái)取的相關(guān)信息) 。如圖:
5.
配置 URL Scheme 打開*-Info.plist(*代表你的工程名字) 。在配置文件中新增一項(xiàng) URL types (如果存在可以不創(chuàng)建) 展開 URL types – URL Schemes, URL Schemes 下新增一項(xiàng)用于新浪微博 , 在 授權(quán)的 Scheme(如果不添加則會(huì)導(dǎo)致新浪微博的 SSO 授權(quán)方式無(wú)法返回應(yīng)用) 。其填寫格式為: sinaweibosso.2279784657,其中后面的數(shù)字段為你在新浪微博申請(qǐng)的 AppKey。如下圖所示:
另外,如果需要使用微信或者 QQ 平臺(tái)接口也需要在此項(xiàng)下面添加相應(yīng)的 Scheme。 6.嵌入代碼
打開*AppDelegate.m(*代表你的工程名字)?6?5 在
?6?5-
(BOOL)application:(UIApplication
*)application
didFinishLaunchingWithOptions:(NSDictionary *)launchOptions ?6?5 方法內(nèi)添加如
下語(yǔ)句:
[ShareSDK registerApp:@"520520test"]; 然后,在處理請(qǐng)求 URL 的委托方法中加入 ShareSDK 的處理方法,如下: - (BOOL)application:(UIApplication *)application handleOpenURL:(NSURL *)url { return [ShareSDK handleOpenURL:url wxDelegate:self]; } - (BOOL)application:(UIApplication *)application openURL:(NSURL *)url sourceApplication:(NSString *)sourceApplication annotation:(id)annotation { return [ShareSDK handleOpenURL:url wxDelegate:self]; } 此處理方法已包括微信和 QQ 的回復(fù)處理,如果使用 ShareSDK 內(nèi)置提示功能可以不需要再實(shí)現(xiàn)消息的 微信和 QQ 的回復(fù)消息捕獲。
7.分享內(nèi)容 在分享內(nèi)容部分 ShareSDK 提供了三種接口來(lái)滿足不同需求的分享功能實(shí)現(xiàn)。 7.1 菜單方式分享: 使用此方式進(jìn)行分享會(huì)首先彈出菜單供用戶選擇分享的目標(biāo)平臺(tái), 然后再顯示內(nèi)容編輯界面供用戶進(jìn) 行分享內(nèi)容編輯,最后進(jìn)行分享。調(diào)用該方式的接口如下:
id publishContent = [ShareSDK publishContent:@"content" defaultContent:@"" image:[UIImage imageNamed:@"Icon.png"] imageQuality:0.8 mediaType:SSPublishContentMediaTypeNews title:@"ShareSDK" url:url musicFileUrl:nil extInfo:nil fileData:nil];
[ShareSDK showShareActionSheet:self share
本文名稱:ios開發(fā)分享功能,ios app分享功能
文章分享:http://m.rwnh.cn/article42/phpoec.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供品牌網(wǎng)站制作、營(yíng)銷型網(wǎng)站建設(shè)、網(wǎng)站改版、網(wǎng)站排名、小程序開發(fā)、建站公司
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來(lái)源: 創(chuàng)新互聯(lián)