iOS App Extension入門

iOS 10推出了很多新功能丈攒,其中有幾個高調(diào)的變化:通知欄更加實用哩罪,電話可以防騷擾授霸,iMessage變得更加有趣和強大,還有就是新一輪的Siri調(diào)戲际插。這些重大功能讓我們更加期待iOS10正式上線碘耳!作為開發(fā)者,我們也需要不斷為自己充電框弛,想把握先機辛辨?讓我們先來看看它們的基本-App Extension

介紹

應用擴展(App Extension)從iOS 8正式登錄iOS平臺,開發(fā)者可以通過應用擴展為用戶提供系統(tǒng)特定的擴展功能。開發(fā)者通過擴展點(Extension Point)來指定特定的系統(tǒng)功能瑟枫,如Today擴展斗搞,通知欄擴展,Messages擴展慷妙,電話簿擴展等等僻焚。

創(chuàng)建應用擴展

應用擴展必須依附于一個宿主App(iOS10有更新,見下文)景殷,在現(xiàn)有工程中溅呢,選擇File->New->Target->Application Extension來創(chuàng)建一個應用擴展

創(chuàng)建Extension.png

開發(fā)者可以根據(jù)自己的業(yè)務(wù)需求創(chuàng)建不同的應用擴展,也可以在一個App中創(chuàng)建多個應用擴展猿挚。

iOS10開始咐旧,Messages擴展可獨立于宿主App創(chuàng)建:

創(chuàng)建Messages Application.png

Messages Application將自動創(chuàng)建一個Sticker Pack和Messages Extension。
參考iMessage Apps and Stickers, Part 1 WWDC 2016 第7分鐘的介紹绩蜻。

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

  1. 含用戶交互界面的
    如:Today Extension


    Today Extension.png

    包含一個ViewController铣墨,一個ui和一個plist。
    同類型的還有Message Extension(需要Xcode8), Share Extension, Action Extension等办绝。
    2.不含用戶交互界面的
    如:Share Link Extension

Share Link Extension.png

包含一個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
應用擴展life cycle

1.用戶在宿主App中選擇應用擴展(查看其UI或者點擊啟動其功能)穿挨。下面會說明

2.系統(tǒng)啟動應用擴展月弛。在此期間肴盏,宿主App會調(diào)用相關(guān)方法啟動應用擴展,應用擴展可以通過ExtensionContext的到交互信息帽衙。

3.應用擴展執(zhí)行業(yè)務(wù)邏輯叁鉴。有些應用擴展在這個階段不需要和宿主App進行交互,如Share Link Extension佛寿;有些應用擴展則需要和宿主App保持聯(lián)系以監(jiān)聽用戶操作或接受命令幌墓,如iMessage Extension。

4.應用擴展執(zhí)行完畢冀泻,系統(tǒng)將其終止常侣。

在應用擴展的生命周期中,甚至不需要與容器App有任何交互弹渔。實際上胳施,應用擴展運行時,容器App也不需要處于運行狀態(tài)(除非主動調(diào)用)肢专。

應用擴展響應宿主App請求

我們在上文提到了應用擴展的兩種類型舞肆,應用擴展的類型不同,響應請求的方式也不同博杖。
有用戶交互界面的應用擴展在宿主App中展示的時候啟動椿胯,并且加載UI。我們可以在ViewController的loadView等方法中通過self.extensionContext(NSExtensionContext 類型)來獲取宿主App傳給應用擴展的信息剃根。
無用戶交互界面的應用擴展在Handler(NSExtensionPrincipalClass指定的Handler)中直接接受來自宿主App的請求,調(diào)用方法:

- (void)beginRequestWithExtensionContext:(NSExtensionContext *)context;

當應用擴展響應宿主App哩盲,并請求完業(yè)務(wù)邏輯之后,需要主動告知宿主App狈醉。通過調(diào)用NSExtensionContext的這兩個方法:

- (void)completeRequestReturningItems:(nullable NSArray *)items completionHandler:(void(^ __nullable)(BOOL expired))completionHandler;
- (void)cancelRequestWithError:(NSError *)error;

應用擴展執(zhí)行completeRequestReturningItems:之后廉油,系統(tǒng)可以隨時將其終止,如果是有用戶交互界面的應用擴展苗傅,執(zhí)行該方法之后抒线,viewController會立刻dismiss(有用戶交互界面的應用擴展通常都是通過presentViewController的方式顯示的)。

參考

App Extension Programming Guide
NSExtensionContext Class Reference

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末渣慕,一起剝皮案震驚了整個濱河市嘶炭,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌摇庙,老刑警劉巖旱物,帶你破解...
    沈念sama閱讀 219,270評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件遥缕,死亡現(xiàn)場離奇詭異卫袒,居然都是意外死亡,警方通過查閱死者的電腦和手機单匣,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,489評論 3 395
  • 文/潘曉璐 我一進店門夕凝,熙熙樓的掌柜王于貴愁眉苦臉地迎上來宝穗,“玉大人,你說我怎么就攤上這事码秉〈” “怎么了?”我有些...
    開封第一講書人閱讀 165,630評論 0 356
  • 文/不壞的土叔 我叫張陵转砖,是天一觀的道長须鼎。 經(jīng)常有香客問我,道長府蔗,這世上最難降的妖魔是什么晋控? 我笑而不...
    開封第一講書人閱讀 58,906評論 1 295
  • 正文 為了忘掉前任,我火速辦了婚禮姓赤,結(jié)果婚禮上赡译,老公的妹妹穿的比我還像新娘。我一直安慰自己不铆,他們只是感情好蝌焚,可當我...
    茶點故事閱讀 67,928評論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著誓斥,像睡著了一般只洒。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上劳坑,一...
    開封第一講書人閱讀 51,718評論 1 305
  • 那天红碑,我揣著相機與錄音,去河邊找鬼泡垃。 笑死析珊,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的蔑穴。 我是一名探鬼主播忠寻,決...
    沈念sama閱讀 40,442評論 3 420
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼存和!你這毒婦竟也來了奕剃?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,345評論 0 276
  • 序言:老撾萬榮一對情侶失蹤捐腿,失蹤者是張志新(化名)和其女友劉穎纵朋,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體茄袖,經(jīng)...
    沈念sama閱讀 45,802評論 1 317
  • 正文 獨居荒郊野嶺守林人離奇死亡操软,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,984評論 3 337
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了宪祥。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片聂薪。...
    茶點故事閱讀 40,117評論 1 351
  • 序言:一個原本活蹦亂跳的男人離奇死亡家乘,死狀恐怖寂纪,靈堂內(nèi)的尸體忽然破棺而出寻咒,到底是詐尸還是另有隱情,我是刑警寧澤此洲,帶...
    沈念sama閱讀 35,810評論 5 346
  • 正文 年R本政府宣布翔悠,位于F島的核電站业崖,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏蓄愁。R本人自食惡果不足惜腻要,卻給世界環(huán)境...
    茶點故事閱讀 41,462評論 3 331
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望涝登。 院中可真熱鬧雄家,春花似錦、人聲如沸胀滚。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,011評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽咽笼。三九已至顷编,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間剑刑,已是汗流浹背媳纬。 一陣腳步聲響...
    開封第一講書人閱讀 33,139評論 1 272
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留施掏,地道東北人钮惠。 一個月前我還...
    沈念sama閱讀 48,377評論 3 373
  • 正文 我出身青樓,卻偏偏與公主長得像七芭,于是被迫代替她去往敵國和親素挽。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 45,060評論 2 355

推薦閱讀更多精彩內(nèi)容

  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見模式的工具(例如配置管理狸驳,服務(wù)發(fā)現(xiàn)预明,斷路器,智...
    卡卡羅2017閱讀 134,665評論 18 139
  • 歐陽妖閱讀 164評論 0 0
  • 作為備用知識耙箍,memo 學過矩陣理論或者線性代數(shù)的肯定知道正交矩陣(orthogonal matrix)是一個非常...
    HappyPieBinLiu閱讀 5,805評論 0 5
  • 2017年6月22日 今天上午去給寶寶選照片撰糠,在拍照的地方加了三個美女,她們上班著裝統(tǒng)一辩昆,都畫有淡妝阅酪,我提前準備了...
    FAB何穎閱讀 117評論 0 0