當你準備開發一個應用程序擴展,首先選擇你想要的支持任務的擴展點來啓用。 接下來,使用Xcode模板擴展點的選擇和提升默認文件與您的自定義代碼和自定義用戶界面(UI),若是必要的。 優化和測試您的應用程序擴展後,你準備分發它內部包含應用程序。api
由於每一個擴展點目標明確的用戶場景中,你的第一份工做是選擇支持的功能類型的擴展點提供的計劃。 這個選擇很重要,由於它能夠決定你和可用的api,在某些狀況下,其餘api的方式行爲。 表1 - 1 列出了支持擴展點,在iOS和mac OS X。數組
在您爲您的應用選擇有意義的擴展點擴展,包含應用程序添加一個新的目標。添加一個應用程序擴展目標的最簡單方法是使用一個Xcode模板擴展點提供預配置的目標。xcode
添加一個Xcode應用項目的新目標,選擇File > new >的目標。 欄左邊的新目標對話框中,選擇應用程序擴展爲iOS或OS x面板右邊的對話框中,Xcode顯示模板能夠選擇。 例如, 圖3 - 1 顯示了您可使用的模板建立一個iOS應用程序擴展。網絡
後,你選擇一個模板,完成目標添加到您的項目,您應該可以構建和運行項目甚至在您自定義擴展的代碼。 當你建立一個擴展基於一個Xcode模板,你結束的一個擴展包 .appex
。架構
關於64位體系結構app
應用程序擴展目標必須包括arm64架構的架構構建設置或應用商店將被拒絕。 Xcode包括這個架構的「標準結構」設置當您建立一個新的應用程序擴展目標。框架
若是你包含應用程序目標連接嵌入式框架,應用程序必須包括arm64架構或應用商店將被拒絕。
對64位發展的更多信息,見 64位過渡指南可可聯繫 或 64位過渡指南可可 ,這取決於你的目標平臺。
在大多數狀況下,您能夠測試的默認應用程序擴展使其在系統設置或設置,而後經過另外一個應用程序訪問它。例如,你能夠測試一個OS X分享在Safari擴展經過打開一個網頁,點擊分享工具欄按鈕,在出現的菜單中選擇你的擴展。
通常來講,每一個擴展模板包括一個(也就是說,一個屬性列表文件 Info.plist
視圖控制器類文件),和一個默認的用戶界面,全部的定義的擴展點。 默認視圖控制器類(或 主要類 )能夠包含擴展點的存根方法你應該實現。
應用程序擴展目標 Info.plist
文件標識擴展點,能夠指定一些細節關於你的擴展。 至少,文件包括 NSExtension
鑰匙和一本字典擴展點指定的鍵和值。 例如,所需的值 NSExtensionPointIdentifier
關鍵是擴展點的反向DNS名稱,如 com.apple.widget-extension
。 這裏有一些其餘的鍵和值,你能夠看到在您的擴展 NSExtension
字典:
NSExtensionAttributes
字典擴展的具體屬性,例如 PHSupportedMediaTypes
照片編輯擴展。
NSExtensionPrincipalClass
主要視圖控制器類的名稱建立的模板,如 SharingViewController
。 當主機應用程序調用您的擴展,擴展點實例化這個類。
NSExtensionMainStoryboard
(僅iOS擴展)
默認的故事板文件擴展,一般命名 MainInterface
。
除了屬性列表設置,默認模板能夠設置一些功能。 每一個擴展點能夠定義功能意義的任務擴展點支持的類型。 例如,一個iOS文件提供者擴展包括 com.apple.security.application-groups
權利。
全部模板包括應用程序沙箱和OS X應用程序擴展 com.apple.security.files.user-selected.read-only
默認狀況下權利。 您可能須要爲您的擴展定義額外的功能若是須要作事情喜歡使用網絡或訪問用戶的照片或聯繫信息。
當你學到的 理解一個擴展是如何工做的 ,當一個用戶打開應用程序擴展選擇擴展在主機應用程序和主機應用程序發出請求。 在高級別上,您的擴展接收請求,幫助用戶執行一個任務,並完成或取消請求,根據用戶的行動。 例如,分享擴展從主機應用程序接收請求,響應經過顯示其觀點。 視圖中用戶撰寫的內容以後,他們選擇發佈內容或取消發佈,並相應地擴展完成或取消請求。
當一個主機應用程序發送一個請求,它指定應該運行應用程序的環境中擴展。 對於許多擴展,最重要的部分項目的上下文是一組用戶想要使用他們在擴展。 例如,共享的上下文擴展可能包括選擇文本,用戶想要的職位。
當一個主機應用程序發出的請求(通常狀況下,經過調用 beginRequestWithExtensionContext:
方法),可使用你的應用程序擴展 extensionContext
房地產在其主要視圖控制器上下文。 接下來,您可使用NSExtensionContext
類檢查上下文和得到物品。 一般狀況下,它能夠很好地獲得上下文和物品在你的視圖控制器的 loadView
方法,這樣你能夠在你的視圖中顯示的信息。 讓您的擴展上下文可使用代碼以下:
NSExtensionContext * myExtensionContext = ( 自我 extensionContext ];
特別感興趣的是上下文對象 inputItems
屬性,該屬性能夠包含擴展你的應用程序須要使用的條目。 的inputItems
屬性包含一個數組 NSExtensionItem
對象,每一個包含一個項目擴展能夠工做。 把物品從上下文對象,您可使用下面這樣的代碼:
nsarray * inputItems = ( myExtensionContext inputItems ];
每個 NSExtensionItem
對象包含許多屬性描述方面的項目,好比標題、文本內容,附件,和用戶信息。
注意, 附件
屬性包含一個數組的媒體與項目相關的數據。 例如,在一個項目關聯到一個共享的要求, 附件
網頁的屬性可能包含一個表示一個用戶想要分享。
在用戶使用輸入項(若是合適的話),應用程序擴展一般讓用戶選擇完成或取消任務。 根據用戶的選擇,您的電話completeRequestReturningItems:completionHandler:
主機應用程序,選擇返回物品,或cancelRequestWithError:
,返回一個錯誤代碼。
在iOS應用程序擴展可能須要更多的時間來完成一個冗長的任務,好比網站上傳內容。 在這種狀況下,您可使用nsurlsession
類在後臺啓動傳輸。 由於背景轉移使用一個單獨的進程,轉移後能夠繼續您的擴展完成主機應用程序的請求和終止。 瞭解更多關於使用 nsurlsession
在您的擴展,明白了 進行上傳和下載 。
重要的
雖然您能夠設置後臺網址上傳或下載任務,其餘類型的後臺任務,如支持VoIP或玩背景音頻,沒有可用的擴展。
若是你包括 UIBackgroundModes
關鍵在你的應用程序的擴展 Info.plist
文件,擴展應用商店將被拒絕。 (想要了解更多關於這個關鍵,見 UIBackgroundModes 在 信息屬性列表的關鍵參考 )。
內存限制爲運行應用程序擴展明顯低於內存限制強加於一個前景應用。在這兩個平臺上,該系統可能積極擴展終止,由於用戶但願回到主機應用程序中的主要目標。一些擴展可能比其餘人更低的內存限制:例如,部件必須特別有效,由於用戶可能同時打開幾個小部件。
應用程序擴展不擁有的主要循環運行,因此它是相當重要的,你按照既定規則的良好行爲主要循環運行。 例如,若是您的擴展塊的主要運行循環,它能夠建立一個壞在另外一個擴展或應用程序的用戶體驗。
記住,GPU是系統中的共享資源,因此應用程序擴展不要首要任務。 例如,今天小部件,運行一個圖形密集的比賽能夠給用戶一個糟糕的經歷在兩個平臺上,並極可能被終止,由於內存壓力。
大多數擴展點須要你提供至少一些自定義UI,用戶打開應用程序時所看到的擴展。 通常來講,一個擴展的UI應該簡單,剋制,集中在單個任務的實現。 提升性能和用戶體驗,你想避免包括外部UI不支持您的擴展的主要任務。
大多數Xcode UI應用程序擴展模板提供一個佔位符開始,您可使用。
用戶一般識別應用程序擴展到它的圖標。 在大多數狀況下,一個擴展的圖標同樣包含應用程序的應用程序圖標。使用包含應用程序的圖標(或者相似的)幫助用戶是相信一個擴展其實是由他們安裝的應用程序。 然而,有一些例外。
在iOS,自定義動做擴展使用的模板映像版本包含應用程序的應用程序圖標。
在OS X,應用擴展提供了一個包含應用程序圖標只有其只是一個包裝器;不然,延長使用包含應用程序的圖標。
應用程序擴展須要一個短的,可辨認的名字。 一個可辨認的名字幫助用戶將您的擴展與包含應用程序並使其容易管理整個系統的擴展。 你的名字的擴展提供了擴展目標 CFBundleDisplayName
價值。 您能夠編輯此值的擴展Info.plist
文件(確保你本地化名稱)。 若是你不提供一個名稱 CFBundleDisplayName
鍵,您的擴展將使用包含應用程序的名稱,由於它出如今 CFBundleName
價值。
一些應用程序擴展也須要簡短的描述。 例如,一個OS X小部件顯示一個描述,幫助用戶選擇他們想看到小部件在今天視圖中。 提供該文本,編輯的價值 widget.description
在你的小部件的關鍵 InfoPlist.strings
文件。
使用Xcode調試應用程序擴展很像使用Xcode調試其餘過程,但有一個重要的區別:你必須選擇一個主機應用程序,您能夠訪問擴展。 當你構建和運行您的擴展,Xcode發射主機應用程序,並等待你來調用擴展以前將調試器附加到擴展的過程。 您指定一個主機應用程序中 計劃 (爲你的擴展 計劃 封裝爲目標構建指令)。
默認狀況下,Xcode爲應用程序建立一個計劃擴展當你添加一個擴展目標包含應用程序的項目。 擴展計劃容許你指定一個應用程序或其餘可執行主機運行時擴展調試它。 擴展指定的默認計劃推出的可執行主機上問,這意味着提示您選擇一個主機應用程序每次構建和運行時擴展。
在您運行您的應用程序構建和擴展以前,檢查確保擴展的計劃被選中。 你能夠設置適當的方案經過選擇產品>計劃> MyExtensionName
或單擊計劃在Xcode工具欄和彈出菜單選擇 MyExtensionName
。
當你構建並運行你的應用程序擴展,Xcode顯示主機的應用程序列表。 在您從列表中選擇一個主機應用程序並單擊運行,調試導航器顯示調試器等待鏈接到您的擴展。 當你從主機訪問您的擴展應用,Xcode自動高度調試器擴展,集任何活躍的斷點,並容許擴展執行。 此時,您可使用相同的Xcode調試特性用來調試其餘進程。
在OS X中,您須要啓用應用程序擴展以前,你能夠從一個主機應用程序訪問它。通常來講,擴展面板啓用了一個擴展的系統設置(你也能夠打開擴展面板,選擇更多的分享或操做菜單)。 注意,您不須要啓用一個OS X今天小部件使用小部件時模擬器運行和調試。 在iOS模擬器,您必須啓用鍵盤擴展以前,你能夠訪問和調試(您能夠啓用鍵盤擴展鍵盤設置> General > >鍵盤)。
Xcode寄存器構建應用程序擴展在調試會話期間在OS X。這意味着,若是你想在OS X上安裝擴展的開發版本須要使用儀從構建位置將其複製到一個位置等應用程序文件夾。
由於必須響應和高效應用的擴展,它是一個好主意去看調試的調試儀表導航器當你運行你的擴展。 調試儀表顯示您的擴展使用的CPU,內存,它運行時和其餘系統資源。 若是你看到性能問題的證據,如一個不尋常的CPU使用量飆升,您可使用工具來配置您的擴展和識別須要改進的地方。 你能夠在調試會話中打開工具當你點擊配置文件在任何調試儀器評估報告(查看調試測量報告,單擊調試地區計)。 瞭解更多關於調試儀表,明白了 調試應用程序學習如何使用工具,請參閱 儀器用戶指南 。
測試應用程序擴展使用Xcode測試框架(即XCTest api),編寫測試,運動包含應用程序的擴展代碼使用您的主機環境。 更多地瞭解測試,看看 測試與Xcode 。
你不能提交應用程序擴展到應用程序商店,除非是在一個包含應用程序,和你不能轉移從一個程序轉到另外一個延伸。
提供一個iOS應用程序擴展,您必須提交一份包含應用程序到應用程序商店。 此外,你的iOS用戶包含應用程序必須提供的功能,它不能包含擴展。
提供一個OS X應用程序擴展,建議您提交您的包含app Store應用程序,但這不是必需的。 在OS X中,包含應用程序能夠提供擴展,它沒有提供任何功能除了擴展。