App Extension應用擴展

App Extension應用擴展

對於App Extension, 相信大家並不陌生,在iOS8系統中,蘋果爲了使app間數據甚至功能進行共享,就有了 擴展 這一功能,
應用程序擴展不是一個應用,相反,它是主體應用程序(containing app)中一個單獨的包,並能生成單獨的二進制文件。與主體應用程序不同,應用擴展實現的是一個特定的、狹義範圍內的任務,並且要嚴格遵循擴展點的協議。下面主要在四個方面進行講解。

  • 1. 名詞解釋 App Extension
  • 2.應用擴展的類型
  • 3.應用程序擴展的生命週期
  • 4.應用擴展是如何進行通信的

1.名詞解釋 App Extension

基於iOS系統的安全性考慮,其應用的數據存儲是通過沙盒模式進行的,要實現應用之間的數據共享十分困難,功能共享就更加棘手。在iOS8系統中,apple爲我們提供了一個革命性的功能:擴展。我們可以通過擴展來使app間數據甚至功能進行共享。

沙盒 - 應用程序只能在該程序創建的文件系統中讀取文件,不可以去其它地方訪問,此區域被成爲沙盒,所以所有的非代碼文件都要保存在此,例如圖像,圖標,聲音,映像,屬性列表,文本文件等。總體來說沙盒就是一種獨立、安全、封閉的空間。

應用擴展程序可以讓我們自定義功能和內容擴展到應用程序之外,並在用戶與其他應用程序或系統交互時提供給用戶使用。

2.應用擴展的類型

在iOS8種,只有6種擴展, 包括Today Extension, Share Extension,Action Extension, Photo Editing Extension, Custom Keyboard Extension, Storage Provider Extension, 後來又先序有很多擴展點,具體看圖
這裏寫圖片描述
這裏寫圖片描述

介紹一下常見的擴展

1.Today Extension 以前在通知 today 那欄 現在在spotLight那欄,對於有擴展功能的APP,安裝APP的時候,擴展同時也安裝了,可在spotlight下 點擊Edit 進行添加擴展。如圖天氣,備忘錄 都是系統的擴展,主要是用來進行展示的,同時可以與app進行交互。
這裏寫圖片描述

2.Share Extension 分享擴展可以使用戶在不同的app之間分享內容。這個功能在iOS5的時候就已經出來了,但是僅限於相冊分享圖片到tweeter,iOS6中可以分享到Facebook,但是現在,我們可以寫分享擴展來分享到我們自己的服務器。

比如我有一張相冊中的圖片想要通過微信發送給我的朋友,如果沒有分享擴展,我只能打開微信與朋友聊天的界面 -> 選擇發送圖片 -> 到相冊中選擇圖片 -> 然後發送。但是有了分享擴展,我可以直接在相冊中點擊分享按鈕,點擊微信,選擇好友後,直接分享給好友,而不用打開微信來發送了。
這裏寫圖片描述這裏寫圖片描述

3.Action extensions(行爲擴展): 行爲擴展這個名字有點難理解,它可以讓用戶查看和改變一個app中的某些內容,而不用離開這個app。

比如我在知乎看帖子,碰到一個不會的單詞,咋辦?如果沒有應用擴展,我只能切換到有道詞典,輸入這個單詞來查看,然後再切回知乎,但是現在有了有道詞典的行爲擴展,我只要複製這個單詞,點擊共享,在下面 選擇有道詞典的擴展,就可以不用打開有道詞典這個app了,而直接能夠顯示出翻譯結果。

4.Photo Editing extensions (圖片編輯擴展):圖片編輯擴展可以使用戶直接在iphone的手機相冊中利用第三方圖片編輯軟件提供的擴展來編輯圖片。

比如我現在有一張自拍照,想要編輯一下。如果沒有圖片編輯擴展的話,我只能打開美圖秀秀之類的圖片編輯軟件,導入圖片,編輯保存。有了圖片編輯擴展之後,我只需要在系統相冊中找到這張圖片,點擊分享按鈕調出菜單,選擇第三方的圖片編輯擴展,就可以直接進入編輯界面,編輯完直接保存,而不用再打開這個圖片編輯軟件導入圖片來進行編輯了。但是這個擴展僅限於在自帶的相冊中進行編輯,而不是所有app中圖片都可以。

5.Document Provider extensions (文件提供者擴展):文件提供者擴展會顯示一個文件選擇視圖給用戶,這些選擇項可以讓用戶導入,導出,或者用其他app來打開這個文件。

6.Custom Keyboard extensions(自定義鍵盤擴展):自定義鍵盤擴展可以讓開發者創建系統鍵盤之外的自定義鍵盤,比如搜狗輸入法。

3.應用程序擴展的生命週期

一些名詞解釋

extension並不是一個獨立的app,它有一個包含在app bundle中的獨立bundle,extension的bundle後綴名是 .appex

containing app

儘管蘋果開放了extension,但是在iOS中extension並不能單獨存在,要想提交到AppStore,必須將extension包含在一個app中提交,並且app的實現部分不能爲空,這個包含extension的app就叫containing app。

extension會隨着containing app的安裝而安裝,同時隨着containing app的卸載而卸載。

host app
能夠調起extension的app被稱爲host app,比如widget的host app就是Today。

舉例:

在Safari上點擊微博的分享按鈕,就會彈出微博的輸入框,然後按分享。那麼Host app就是Safari,而App extension則是那個彈出來的微博輸入框,Containing app則是微博。

App extension雖然是屬於Containing app,但是它是獨立出來就像是另一個app一樣.所以打開微博,則需要使用Url scheme,共用數據則需創建共享空間。

生命週期

因爲一個應用程序擴展不是一個應用,所以它的生命週期和運行環境也不同於應用。一般情況來說,應用程序擴展的生命週期始於用戶從某個應用中啓動它。允許用戶選擇某一種擴展來幫助他們執行某項任務的應用,我們稱之爲擴展的“載體應用”(host app)。“載體應用”(host app)定義了激活擴展的上下文環境,並在其發送請求以響應用戶操作時開始擴展的生命週期。當應用擴展完成載體應用發送的請求任務後,該擴展的生命週期也隨之結束。

比如說,假定這樣一個場景,用戶在擴展載體應用(host app)中選中一段文字,點擊分享按鈕,並從分享列表中選擇某一個分享擴展,將選中的內容分享至社交網站。此時,載體應用就會向擴展發送一個包含用戶所選文本的請求,啓動該擴展,從而去響應用戶的請求,即分享所選文本的內容。應用擴展基本的生命週期歸納在下圖中。

這裏寫圖片描述

在上圖中的第2步中,系統實例化載體應用請求中確定的擴展,並在兩者之間建立通信通道。然後擴展在載體應用的上下文場景中顯示相關界面,並使用其在載體應用請求中接收到的項目來執行任務(在上述的例子中,擴展接收到的項目是用戶選中的文本)

在上圖的第3步中,用戶在擴展中執行或取消某個任務,或者直接可以忽略該擴展。在對用戶的操作做出響應的過程中,擴展會根據載體應用的請求立即開始執行任務,但如果有特殊需要時,擴展也會在系統後臺執行任務,這種情況下,載體不會顯示擴展相關界面,並且用戶返回到其先前在載體應用中的上下文環境。當應用擴展執行完任務後,不管是立刻返回還是延遲返回,但最後其執行結果都會返回給載體應用。

總結:

extension和普通app的最大區別之一是生命週期。
開始 在用戶通過host app點擊extension時,系統就會實例化extension應用,這是生命週期的開始。
執行任務 在extension啓動以後,開始執行它的使命。
終止 在用戶取消任務,或者任務執行結束,或者開啓了一個長時後臺任務時,系統會將其殺掉。

4.應用擴展是如何進行通信的

應用擴展在運行的時候,它只會直接和載體應用(host app)進行通信,而擴展和containing app之間不會直接通信。在擴展運行的過程中,主體應用(containing app)甚至都不運行。另外,載體應用(host app)和主體應用(containing app)之間也不會進行通信。

圖描述了運行中的應用擴展、載體應用(host app)以及主體應用(containing app)這三者之間的關係。

運行中的擴展僅和載體應用進行通信。

這裏寫圖片描述

注:extension和host app
extension和host app之間可以通過extensionContext屬性直接通信,該屬性是新增加的UIViewController類別:
這裏寫圖片描述

當一個擴展需要和containing app進行通信時,只能在載體應用確定的上下文環境中進行間接通信。比如,一個應用擴展有可能會運行調用它的應用程序。在這個例子中,擴展使用了不能與 containing app 傳遞消息的API。此外,應用擴展與其 containing app 可以在一個定義爲私有的共享容器中訪問數據。下圖描述了擴展和 containing app 之間的間接通信類型。

運行中的擴展可以與其containing app進行間接通信。

這裏寫圖片描述

注:extension和containing app

不能直接通信,首先,儘管extension的bundle是放在containing app的bundle中,但是他們是兩個完全獨立的進程,之間不能直接通信。不過extension可以通過openURL的方式啓動containing app(當然也能啓動其它app),不過必須通過extensionContext藉助host app來實現:

可以共享Shared resources,extension和containing app可以共同讀寫一個被稱爲Shared resources的存儲區域,這是通過App Groups實現的,

這裏寫圖片描述

宿主應用和應用擴展之間的空間關係
這裏寫圖片描述

參考資源:
—— [ WWDC2014之App Extensions學習筆記 ]

—— [ App Extension Programming Guide ]

推薦文章

—— [ Today Extension 水哥]

—— [ Today Extension 小敏]

—— [ Today Extension segmentfault]

—— [ Today Extension cocoachina]

—— [ Share Extension]

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章