前言
iOS定義了程序擴(kuò)展供開發(fā)使用,可以解釋為一種用戶程序與系統(tǒng)程序的關(guān)聯(lián)。例如:共享,通知中心,鍵盤。


一、App Extension
應(yīng)用程序擴(kuò)展功能與應(yīng)用程序不同,每個擴(kuò)展程序都是獨立于應(yīng)用程序的二進(jìn)制文件。需要注意的是:
At a high level, the best user experience for all extensions is quick, streamlined, and focused on a single task.
這句話很有可能就是你App 擴(kuò)展功能審核不通過的主要原因。
1.Action Extension
2.Audio Unit Extension
3.Broadcast UI Extension
4.Broadcast Upload Extension
5.Call Directory Extension
6.Content Blocker Extension
7.Custom Keyboard Extension
8.Document Provider Extension
9.iMessage Extension
10.Intents Extension
11.Intents UI Extension
12.Notification Content Extension
13.Notification Service Extension
14.Photo Editing Extension
15.Share Extension
16.share Links Extension
17.Spotlight Index Extension
18.Sticker Pack Extension
19.Today Extension?
在“通知中心”的“今日”視圖中快速更新或執(zhí)行快速任務(wù)。
二、App Extension 工作方式
應(yīng)用程序通過擴(kuò)展應(yīng)用程序的事件來響應(yīng)用戶的選擇,從而激活應(yīng)用程序,然后使用其在應(yīng)用程序的的請求事件來執(zhí)行任務(wù)。

擴(kuò)展應(yīng)用程序主要與系統(tǒng)應(yīng)用進(jìn)行通信。

通常情況下,運行應(yīng)用程序,其包含的擴(kuò)展應(yīng)用程序不一定會運行。在典型的請求/響應(yīng)事件中,系統(tǒng)應(yīng)用程序打開擴(kuò)展應(yīng)用程序,通過extensionContext來傳輸數(shù)據(jù)請求,擴(kuò)展程序執(zhí)行操作后,將結(jié)果返回給系統(tǒng)程序。
擴(kuò)展程序可以通過extensionContext.openURL:completionhandler:方法來打開應(yīng)用程序。任何擴(kuò)展程序和應(yīng)用程序都可以訪問Shared Resources中的數(shù)據(jù)。

系統(tǒng)使用進(jìn)程間的通信來確保系統(tǒng)應(yīng)用程序和擴(kuò)展程序協(xié)同工作。
三、App Extension訪問限制
無法訪問shareApplication對象,因此無法使用該對象的任何方法。
應(yīng)用程序的庫文件,頭文件不可訪問,訪問需要重新添加到擴(kuò)展程序中。
不可訪問相機(jī)或者麥克風(fēng)(除iMessage擴(kuò)展程序,當(dāng)然iMessage使用需要在擴(kuò)展程序的Info.plist中配置NSCameraUsageDescription和NSMicrophoneDescription)
不可執(zhí)行長時間運行的后臺任務(wù)。(應(yīng)用擴(kuò)展程序可以使用NSURLSession對象)
可以使用AirDrop。
四、App Extension的創(chuàng)建
例如:Xcode->File->New->Target->Today Extension
通過這樣的方式創(chuàng)建出來的App Extension 一般會有一個文件包,所有的代碼操作就在這個文件包中進(jìn)行。
五、App Extension的方法介紹
當(dāng)系統(tǒng)應(yīng)用調(diào)用擴(kuò)展程序是會調(diào)用beginRequestWithExtensionContext:方法,擴(kuò)展程序可以通過extensionContext獲取系統(tǒng)數(shù)據(jù)。
獲?。簂et myExtensionContext = extensionContext
?其inputItems成員變量會攜帶系統(tǒng)信息,例如,分享的標(biāo)題,內(nèi)容文本,附件和用戶星系。
擴(kuò)展程序通過調(diào)用completeRequestReturningItems:completionHandler:方法,有選擇的將NSExtensionItem對象返回到系統(tǒng)程序或著cancelRequetWithError:方法中。