天天看點

iOS App Extension入門

原文連結iOS App Extension入門

介紹

應用擴充(App Extension)從iOS 8正式登入iOS平台,開發者可以通過應用擴充為使用者提供系統特定的擴充功能。開發者通過擴充點(Extension Point)來指定特定的系統功能,如Today擴充,通知欄擴充,Messages擴充,電話簿擴充等等。

建立應用擴充

應用擴充必須依附于一個宿主App(iOS10有更新,見下文),在現有工程中,選擇File->New->Target->Application Extension來建立一個應用擴充

iOS App Extension入門

開發者可以根據自己的業務需求建立不同的應用擴充,也可以在一個App中建立多個應用擴充。

iOS10開始,Messages擴充可獨立于宿主App建立:
iOS App Extension入門

Messages Application将自動建立一個Sticker Pack和Messages Extension。

參考iMessage Apps and Stickers, Part 1 WWDC 2016 第7分鐘的介紹。

Xcode會為我們自動生成一些檔案,有兩種類型:

  1. 含使用者互動界面的

    如:Today Extension

    iOS App Extension入門

    包含一個ViewController,一個ui和一個plist。

    同類型的還有Message Extension(需要Xcode8), Share Extension, Action Extension等。

    2.不含使用者互動界面的

    如:Share Link Extension

iOS App 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擁有不同的程序。

iOS App Extension入門

應用擴充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;
           
應用擴充執行

completeRequestReturningItems:

之後,系統可以随時将其終止,如果是有使用者互動界面的應用擴充,執行該方法之後,viewController會立刻dismiss(有使用者互動界面的應用擴充通常都是通過

presentViewController

的方式顯示的)。

參考

App Extension Programming Guide

NSExtensionContext Class Reference