原文連結iOS App Extension入門
介紹
應用擴充(App Extension)從iOS 8正式登入iOS平台,開發者可以通過應用擴充為使用者提供系統特定的擴充功能。開發者通過擴充點(Extension Point)來指定特定的系統功能,如Today擴充,通知欄擴充,Messages擴充,電話簿擴充等等。
建立應用擴充
應用擴充必須依附于一個宿主App(iOS10有更新,見下文),在現有工程中,選擇File->New->Target->Application Extension來建立一個應用擴充
![](https://img.laitimes.com/img/__Qf2AjLwojIjJCLyojI0JCLiADNyEzLcd3LcJzLcJzdllmVldWYtl2Q3UCcpJHdz9CX05WZpJ3bt8Gd1F2LcJjcn9WTldWYtl2Pn5GcuUjZwgTM4EWNhljMlZGMzgTLzQDO1EDNx8CXzV2Zh1WafRWYvxGc19CXvlmL1h2cuFWaq5ycldWYtlWLkF2bsBXdvw1LcpDc0RHaiojIsJye.png)
開發者可以根據自己的業務需求建立不同的應用擴充,也可以在一個App中建立多個應用擴充。
iOS10開始,Messages擴充可獨立于宿主App建立:![]()
iOS App Extension入門 Messages Application将自動建立一個Sticker Pack和Messages Extension。
參考iMessage Apps and Stickers, Part 1 WWDC 2016 第7分鐘的介紹。
Xcode會為我們自動生成一些檔案,有兩種類型:
-
含使用者互動界面的
如:Today Extension
iOS App Extension入門 包含一個ViewController,一個ui和一個plist。
同類型的還有Message Extension(需要Xcode8), Share Extension, Action Extension等。
2.不含使用者互動界面的
如:Share Link Extension
包含一個Handler和plist。
同類型的還有Call Directory Extension(需要Xcode8)等。
這兩種類型的plist大緻相同,除了NSExtension這個屬性。
含使用者互動界面的應用擴充會定義
NSExtensionMainStoryboard
,通常會是MainInterface;而不含使用者互動界面的應用擴充則會定義
NSExtensionPrincipalClass
,通常會是XXXHandler(在Share Link Extension的例子中是RequestHandler)。
生命周期
了解應用擴充的生命周期,首先要了解兩個概念:
1.容器App (container app)
2.宿主App (host app)
容器App是包含應用擴充的App,就是應用擴充所依賴的App;
宿主App是提供應用擴充界面顯示或者功能的App。
其次:
雖然容器App包含應用擴充,但它與應用擴充有着完全不同的生命周期,應用擴充與容器App擁有不同的程序。
應用擴充life cycle
1.使用者在宿主App中選擇應用擴充(檢視其UI或者點選啟動其功能)。下面會說明
2.系統啟動應用擴充。在此期間,宿主App會調用相關方法啟動應用擴充,應用擴充可以通過ExtensionContext的到互動資訊。
3.應用擴充執行業務邏輯。有些應用擴充在這個階段不需要和宿主App進行互動,如Share Link Extension;有些應用擴充則需要和宿主App保持聯系以監聽使用者操作或接受指令,如iMessage Extension。
4.應用擴充執行完畢,系統将其終止。
在應用擴充的生命周期中,甚至不需要與容器App有任何互動。實際上,應用擴充運作時,容器App也不需要處于運作狀态(除非主動調用)。
應用擴充響應宿主App請求
我們在上文提到了應用擴充的兩種類型,應用擴充的類型不同,響應請求的方式也不同。
有使用者互動界面的應用擴充在宿主App中展示的時候啟動,并且加載UI。我們可以在ViewController的
loadView
等方法中通過
self.extensionContext
(NSExtensionContext 類型)來擷取宿主App傳給應用擴充的資訊。
無使用者互動界面的應用擴充在Handler(
NSExtensionPrincipalClass
指定的Handler)中直接接受來自宿主App的請求,調用方法:
當應用擴充響應宿主App,并請求完業務邏輯之後,需要主動告知宿主App。通過調用
NSExtensionContext
的這兩個方法:
- (void)completeRequestReturningItems:(nullable NSArray *)items completionHandler:(void(^ __nullable)(BOOL expired))completionHandler;
應用擴充執行之後,系統可以随時将其終止,如果是有使用者互動界面的應用擴充,執行該方法之後,viewController會立刻dismiss(有使用者互動界面的應用擴充通常都是通過
completeRequestReturningItems:
的方式顯示的)。
presentViewController
參考
App Extension Programming Guide
NSExtensionContext Class Reference