轉(zhuǎn)載請注明出處:http://www.cnblogs.com/zhanggui/p/7119572.html

1.前言

這里主要是對App Extension的一些介紹以及詳細(xì)給大家介紹一下Share Extension,后期會(huì)添加其他的Extension介紹。

2.開始

主要對App Extension和Share Extension進(jìn)行介紹。請繼續(xù)往下看:

2.1: App Extension的介紹

 官方給的說法是:App Extension可以讓你擴(kuò)展你的APP的自定義功能和內(nèi)容,使用戶可以在與其他應(yīng)用或者系統(tǒng)進(jìn)行互動(dòng)的時(shí)候去使用它。翻譯的不一定準(zhǔn)確,這樣說可能會(huì)好理解:我們平時(shí)看到的Widget、微信和QQ的share等等,都是App Extension,下圖是一些例子:

大數(shù)據(jù)培訓(xùn),云培訓(xùn),數(shù)據(jù)挖掘培訓(xùn),云計(jì)算培訓(xùn),高端軟件開發(fā)培訓(xùn),項(xiàng)目經(jīng)理培訓(xùn)大數(shù)據(jù)培訓(xùn),云培訓(xùn),數(shù)據(jù)挖掘培訓(xùn),云計(jì)算培訓(xùn),高端軟件開發(fā)培訓(xùn),項(xiàng)目經(jīng)理培訓(xùn)大數(shù)據(jù)培訓(xùn),云培訓(xùn),數(shù)據(jù)挖掘培訓(xùn),云計(jì)算培訓(xùn),高端軟件開發(fā)培訓(xùn),項(xiàng)目經(jīng)理培訓(xùn)

其實(shí)就是我們經(jīng)??吹降腤idget,但是Widget只是Today Extension,除了Today Extension,還有很多。

一個(gè)支持?jǐn)U展的系統(tǒng)區(qū)域叫做一個(gè)extension point(擴(kuò)展點(diǎn))。每個(gè)擴(kuò)展點(diǎn)的擴(kuò)展都有自己獨(dú)有的使用方法和API。你可以根據(jù)你的需求來選擇不同的擴(kuò)展。官方API里面提出了一個(gè)名詞叫:Host app,我們可以把它理解為宿主的App也就是提供應(yīng)用擴(kuò)展界面顯示或者功能的App。還有一個(gè)container app,我們可以把它理解為容器App,就像上圖的微信share extension,容器app就是微信。

擴(kuò)展和app不同,擴(kuò)展無法單獨(dú)上架AppStore。盡管你必須使用個(gè)app來包含并且分發(fā)你的extension,extension也是一個(gè)單獨(dú)的二進(jìn)制文件,獨(dú)立于用于傳遞和分發(fā)的container app。

你可以通過File--->New --->Target來創(chuàng)建Extension,它和其他的target一樣,它和你的app project組合成為一個(gè)產(chǎn)品。一個(gè)app可以有一個(gè)擴(kuò)展,也可以有多個(gè)擴(kuò)展。最好的創(chuàng)建擴(kuò)展的方式就是通過Xcode提供的Extension種類選擇自己需要的來創(chuàng)建,里面包含了必要的API以及方法實(shí)現(xiàn)。

如果你想讓用戶去使用你的擴(kuò)展,那么就需要吧你的containing app發(fā)布到AppStore,當(dāng)用戶安裝了你的Containing app,擴(kuò)展也就安裝了。不同的擴(kuò)展啟動(dòng)的方式也不一樣,例如Today Extension,你需要Widget來展示到你的通知中心。擴(kuò)展也不要亂用,擴(kuò)展的最佳用戶體驗(yàn)從來都是希望用戶操作更精簡、更快速,并且專注于單個(gè)任務(wù)。

 

2.1.1: Extension的種類

我們可以在Xcode的File--->New--->Target里面看到不同平臺(tái)的Extension,包括iOS、watchOS、tvOS、macOS等等。這里主要介紹iOS,主要包括以下幾種Extensions:

1.Action Extension:動(dòng)作擴(kuò)展,在另一個(gè)應(yīng)用程序的上下文中操作或者查看內(nèi)容

2.Audio Unit Extension:音頻單元擴(kuò)展

3.Broadcast UI Extension:廣播UI 擴(kuò)展

4.Broadcast Upload Extension:廣播上傳擴(kuò)展

5.Call Directory Extension:呼叫目錄擴(kuò)展

6.Content Blocker Extension:內(nèi)容攔截器擴(kuò)展

7.Custom Keyboard Extension:鍵盤擴(kuò)展,例如第三方的鍵盤,搜狗輸入法,百度輸入法等。

8.iMessage Extension:消息的擴(kuò)展

9.Intents Extension:Intents擴(kuò)展

10.Intents UI Extension:Intents UI擴(kuò)展

11.Notification Content Extension:通知內(nèi)容擴(kuò)展

12.Notification Service Extension:通知服務(wù)擴(kuò)展

13.Photo Editing Extension:圖片編輯擴(kuò)展,在照片app中編輯照片或者視頻

14.Share Extension:分享擴(kuò)展,發(fā)布一個(gè)共享網(wǎng)站或者與其他應(yīng)用共享內(nèi)容。

15.Shared Links Extension:分享鏈接擴(kuò)展

16.Spotlight Index Extension:Spotlight 索引擴(kuò)展

17.Sticker Pack Extension:貼紙包擴(kuò)展

18.Today Extension:Today擴(kuò)展,可以快速獲取更新或者在通知中心的近日視圖中執(zhí)行一項(xiàng)快速任務(wù)。

等等。也可直接在這里參見更多extension。

2.1.2: App Extensions的生命周期

先上圖,估計(jì)你已經(jīng)看到了好多次這張圖,恭喜你這次又看到了,因?yàn)檫@個(gè)是蘋果官方提供的圖片。

 大數(shù)據(jù)培訓(xùn),云培訓(xùn),數(shù)據(jù)挖掘培訓(xùn),云計(jì)算培訓(xùn),高端軟件開發(fā)培訓(xùn),項(xiàng)目經(jīng)理培訓(xùn)

 

1.用戶選擇要使用的App extension

2.系統(tǒng)啟動(dòng)App Extension

3.App Extension 代碼運(yùn)行

4.運(yùn)行完之后系統(tǒng)kill掉App Extension

這就是App Extension的生命周期,舉個(gè)例子:

一個(gè)Share Extension,在圖庫里面你選擇了一張圖片,然后點(diǎn)擊分享,選擇你的Share Extension(第一步),此時(shí)系統(tǒng)會(huì)啟動(dòng)你的Share Extension(第二步)。然后你將選擇的圖片分享到指定的程序(例如微信的發(fā)送給朋友)(第三步)。接下來分享頁面關(guān)閉,系統(tǒng)kill掉了Share Extension。

2.1.3: App Extension的通信方式

App Extension主要的通信是和他的host app(例如微信的Share Extension和微信),來自host app的請求和extension的response。下圖你應(yīng)該也很熟悉(app 擴(kuò)展直接和host app溝通):

大數(shù)據(jù)培訓(xùn),云培訓(xùn),數(shù)據(jù)挖掘培訓(xùn),云計(jì)算培訓(xùn),高端軟件開發(fā)培訓(xùn),項(xiàng)目經(jīng)理培訓(xùn)

 

 

 

這個(gè)展示的就是正在運(yùn)行的App Extension、host app和containing app之間的關(guān)系。可以看出:Containing App和app Extension并沒有直接的溝通。甚至有的時(shí)候Containing app可以不運(yùn)行,而App Extension直接運(yùn)行。Containing app和Host app沒有任何的溝通。

在一個(gè)典型的request/response中,系統(tǒng)打開代表host app(圖庫)的extension(微信分享的share extension),把host app提供的數(shù)據(jù)(圖片和選擇的好友)輸送到extension的context,然后extension展示界面,提供一些功能任務(wù)(例如微信的分享到朋友)。

還有一種是app extension可以直接和他的containing app溝通:

大數(shù)據(jù)培訓(xùn),云培訓(xùn),數(shù)據(jù)挖掘培訓(xùn),云計(jì)算培訓(xùn),高端軟件開發(fā)培訓(xùn),項(xiàng)目經(jīng)理培訓(xùn)

例如Today Widget,可以直接告訴系統(tǒng)打開他的Containing app,只需要調(diào)用NSExtensionContext的openURL:CompletionHandler:方法即可。

2.1.4: 在App Extension中不可以做的事情

一個(gè)app extension不能有以下情況:

1.訪問sharedApplication對象。因此不能使用任何該對象的防范

2.使用任何標(biāo)記NS_EXTENSION_UNAVAILABLE宏的API,或者類似的宏,或者不可用framework里面的API,例如HealthKit framework不能用于app extensions

3.iOS設(shè)備訪問相機(jī)或者麥克風(fēng)(iMessage app可以訪問這些資源,只要在Info.plist里面進(jìn)行配置使用描述即可)

4.運(yùn)行一個(gè)長時(shí)間的后臺(tái)任務(wù)(根據(jù)不同平臺(tái)而異)

5.使用AirDrop接收數(shù)據(jù)

 2.2: Share Extension的簡單使用

這里我們以Share Extension為例進(jìn)行介紹。

2.2.1: 選擇正確的Extension Point開始開發(fā) 

當(dāng)你創(chuàng)建app extension的時(shí)候,可以直接使用Xcode自帶的模板創(chuàng)建你需要的Extension。點(diǎn)擊File--->New--->Target:

大數(shù)據(jù)培訓(xùn),云培訓(xùn),數(shù)據(jù)挖掘培訓(xùn),云計(jì)算培訓(xùn),高端軟件開發(fā)培訓(xùn),項(xiàng)目經(jīng)理培訓(xùn)

從這里選擇符合你需求的Extension,當(dāng)你創(chuàng)建完畢后,你的項(xiàng)目工程目錄就會(huì)多一個(gè)文件夾:

大數(shù)據(jù)培訓(xùn),云培訓(xùn),數(shù)據(jù)挖掘培訓(xùn),云計(jì)算培訓(xùn),高端軟件開發(fā)培訓(xùn),項(xiàng)目經(jīng)理培訓(xùn)

可以發(fā)現(xiàn)多了一個(gè).swift、.storyboard和一個(gè)Info.plist。接下來你也會(huì)在Scheme里發(fā)現(xiàn)一個(gè)Extension,而且多了一個(gè)以.appex為后綴的Bundle

大數(shù)據(jù)培訓(xùn),云培訓(xùn),數(shù)據(jù)挖掘培訓(xùn),云計(jì)算培訓(xùn),高端軟件開發(fā)培訓(xùn),項(xiàng)目經(jīng)理培訓(xùn)

這里需要注意:

一個(gè)app extension必須在architectures build settings 里面包含arm64(ios)或者x86_64(OS X),否則containing app上架的時(shí)候?qū)?huì)被拒絕。Xcode默認(rèn)的Standard architecture包含了64-bit的architecture。

大數(shù)據(jù)培訓(xùn),云培訓(xùn),數(shù)據(jù)挖掘培訓(xùn),云計(jì)算培訓(xùn),高端軟件開發(fā)培訓(xùn),項(xiàng)目經(jīng)理培訓(xùn)

An app extension target must include the arm64 (iOS) or x86_64 architecture (OS X) in its Architectures build settings or it will be rejected by the App Store. Xcode includes the appropriate 64-bit architecture with its “Standard architectures” setting when you create a new app extension target.

If your containing app target links to an embedded framework, the app must also include 64-bit architecture or it will be rejected by the App Store.

大數(shù)據(jù)培訓(xùn),云培訓(xùn),數(shù)據(jù)挖掘培訓(xùn),云計(jì)算培訓(xùn),高端軟件開發(fā)培訓(xùn),項(xiàng)目經(jīng)理培訓(xùn)

 2.2.2: 來看看默認(rèn)的App Extension模板

從上面的項(xiàng)目工程目錄看,每個(gè)extension都包含了一個(gè)plist文件、一個(gè)視圖控制器類和一個(gè)默認(rèn)的user interface,這些都是被extension point定義的。我們先來看一下Info.plist里面的東西:

大數(shù)據(jù)培訓(xùn),云培訓(xùn),數(shù)據(jù)挖掘培訓(xùn),云計(jì)算培訓(xùn),高端軟件開發(fā)培訓(xùn),項(xiàng)目經(jīng)理培訓(xùn)

再看看項(xiàng)目工程的Info.plist:
大數(shù)據(jù)培訓(xùn),云培訓(xùn),數(shù)據(jù)挖掘培訓(xùn),云計(jì)算培訓(xùn),高端軟件開發(fā)培訓(xùn),項(xiàng)目經(jīng)理培訓(xùn)

兩者可以進(jìn)行一個(gè)對比,可以看出:

1、CFBundlePackageType不一樣,項(xiàng)目是APPL,而Extension的是XPC!

2、比較明顯的就是App Extension里面多了一個(gè)NSExtension的字典。 

在Info.plist中,該文件必須包含NSExtension鍵和擴(kuò)展點(diǎn)指定的鍵和值的字典。這里的ExtensionPointIdentifier是com.apple.share-services,因?yàn)槲覄?chuàng)建的是Share Extension。

這里注意,如果你的app extension的Info.plist里面包含了UIBackgroundModes key那么將無法通過AppStore的審核。 

 

2.2.3:調(diào)試App Extension 

調(diào)試App Extension很簡單,你要做的就是選擇(scheme)擴(kuò)展,然后點(diǎn)擊Run, 就會(huì)彈出一個(gè)彈框讓你選擇Host app,選擇Host app之后便可以運(yùn)行調(diào)試。比如你調(diào)試Share Extension,你可以選擇照片,然后讓照片當(dāng)Host app,然后運(yùn)行之后就會(huì)打開照片,選擇分享就會(huì)看到你的app擴(kuò)展,然后進(jìn)行debug斷點(diǎn)處理等。

2.3:Share Extension Demo

先看一下我自己做的分享Demo效果:
大數(shù)據(jù)培訓(xùn),云培訓(xùn),數(shù)據(jù)挖掘培訓(xùn),云計(jì)算培訓(xùn),高端軟件開發(fā)培訓(xùn),項(xiàng)目經(jīng)理培訓(xùn) 大數(shù)據(jù)培訓(xùn),云培訓(xùn),數(shù)據(jù)挖掘培訓(xùn),云計(jì)算培訓(xùn),高端軟件開發(fā)培訓(xùn),項(xiàng)目經(jīng)理培訓(xùn)大數(shù)據(jù)培訓(xùn),云培訓(xùn),數(shù)據(jù)挖掘培訓(xùn),云計(jì)算培訓(xùn),高端軟件開發(fā)培訓(xùn),項(xiàng)目經(jīng)理培訓(xùn)

然后在containing app里面查看分享的圖片:如上圖的第三張圖。先看一下這里默認(rèn)創(chuàng)建的Share Extension的視圖控制器:

 

大數(shù)據(jù)培訓(xùn),云培訓(xùn),數(shù)據(jù)挖掘培訓(xùn),云計(jì)算培訓(xùn),高端軟件開發(fā)培訓(xùn),項(xiàng)目經(jīng)理培訓(xùn)

class ShareViewController: SLComposeServiceViewController {    override func isContentValid() -> Bool {        // Do validation of contentText and/or NSExtensionContext attachments here
        return true
    }    override func didSelectPost() {        // This is called after the user selects Post. Do the upload of contentText and/or NSExtensionContext attachments.    
        // Inform the host that we're done, so it un-blocks its UI. Note: Alternatively you could call super's -didSelectPost, which will similarly complete the extension context.
        self.extensionContext!.completeRequest(returningItems: [], completionHandler: nil)
    }    override func configurationItems() -> [Any]! {        // To add configuration options via table cells at the bottom of the sheet, return an array of SLComposeSheetConfigurationItem here.
        return []
    }

}

大數(shù)據(jù)培訓(xùn),云培訓(xùn),數(shù)據(jù)挖掘培訓(xùn),云計(jì)算培訓(xùn),高端軟件開發(fā)培訓(xùn),項(xiàng)目經(jīng)理培訓(xùn)

 

里面主要有三個(gè)方法:

isContentValid是用來判斷內(nèi)容是否可用的,這里可以做一些校驗(yàn),比如我們分享的內(nèi)容是否符合要分享的要求,如果返回false,那么在上圖的Post按鈕就無法點(diǎn)擊了。因?yàn)橐坏┓祷豧alse,則說明分享內(nèi)容不符合要求,也就無法Post了。

configuration是一個(gè)配置數(shù)組,它可以配置多個(gè)列表,例如微信分享的[發(fā)送給朋友,分享到朋友圈,收藏]:

 大數(shù)據(jù)培訓(xùn),云培訓(xùn),數(shù)據(jù)挖掘培訓(xùn),云計(jì)算培訓(xùn),高端軟件開發(fā)培訓(xùn),項(xiàng)目經(jīng)理培訓(xùn)

 didSelectPost是你點(diǎn)擊發(fā)送之后處理的事件,比如微信的點(diǎn)擊收藏,可以調(diào)用微信的api,然后進(jìn)行收藏。默認(rèn)的注釋也說明了本方法的作用:

當(dāng)用戶選中post之后調(diào)用。是對內(nèi)容或者NSExtensionContext附件的上傳。我這里使用App Group的方式進(jìn)行app Extension和containing app進(jìn)行交互。先將內(nèi)容存儲(chǔ)到UserDefaults,然后再在containing app里面取出圖片展示到containing app里面。

大數(shù)據(jù)培訓(xùn),云培訓(xùn),數(shù)據(jù)挖掘培訓(xùn),云計(jì)算培訓(xùn),高端軟件開發(fā)培訓(xùn),項(xiàng)目經(jīng)理培訓(xùn)

這里我把圖片存儲(chǔ)到了UserDefaults,然后在Containing app里面獲取:

大數(shù)據(jù)培訓(xùn),云培訓(xùn),數(shù)據(jù)挖掘培訓(xùn),云計(jì)算培訓(xùn),高端軟件開發(fā)培訓(xùn),項(xiàng)目經(jīng)理培訓(xùn)

 suite的name是app group的名稱。具體可參見Github源碼里的ShareExtension。 

總結(jié)

App Extension的出現(xiàn)使App的使用更加方便,比如系統(tǒng)的天氣widget,還有類似微信(QQ)的分享,完全可以實(shí)現(xiàn)不打開containing app而直接使用share extension分享。

 在后續(xù)的時(shí)間里,將會(huì)不定期進(jìn)行更新,給讀者介紹其他的Extension,如有任何疑問,隨時(shí)留言溝通。

參考資料

1、App Extension Programming Guide 

2、深入App Extensions for iOS8

3、Information property List Key Reference

4、App Extension Programming Guide---Share

分類: iOS

標(biāo)簽: App ExtensionShare ExtensionExtension

http://www.cnblogs.com/zhanggui/p/7119572.html