1. 在學習 Share Extension 之前,我們需要 先了解一下iOS的App Extension
2.1 創建Share Extension擴展Target
//注意:擴展不能單獨創建,必須依賴于應用工程項目也就是載體,因此如果你還沒有創建一個應用工程,先去創建一個
2.1.1、打開項目設置,在TARGETS側欄地下點擊“+”號來創建一個新的Target,如圖:
添加Target(這邊我已經添加了一個MyAppShare步奏如下)
2.1.2、然后選擇”iOS” -> “Application Extension” -> “Share Extension”,點擊“Next”。如圖:
創建ShareExtension擴展
2.1.3、給擴展起個名字,這里填寫了“MyAppShare”,點擊“Finish”。如圖:
2.1.4、這時候會提示創建一個Scheme,點擊“Activate”
那么,到了這里創建Share Extension的工作就算是完成了。接下來可以先進行一下編譯運行。這里跟做App開發的時候會稍微有點不一樣。因為Extension是需要Host App(宿主應用)來運行的。所以,XCode中會彈出界面讓我們選擇一個iOS的App來運行Extension。如圖:
選擇宿主應用
這里我選擇了XCode建議的應用Safari,然后點擊“Run”來進行調試運行。XCode會啟動Safari,如圖:
我們隨便點開一個網頁,點擊分享按鈕就會彈出分享菜單,如圖:
運行效果圖
可以看到剛才建立的Share擴展已經顯示在面板上了,如果你沒有發現自己的擴展,那么你可以將菜單滑動到最右邊,在“更多”選項中激活自己的擴展。如圖:
我們點擊自己創建的分享項,其彈出一個分享窗口。如圖:
2.2. 配置Share Extension
接下來我們需要給他一些設置。我們展開XCode左側欄的MyASppShare目錄,找到Info.plist文件。如
我們只需要關注以下幾個字段的設置:(更多詳細的Information Property List Key Reference)
Bundle display name
擴展的顯示名稱,默認跟你的項目名稱相同,可以通過修改此字段來控制擴展的顯示名稱。
NSExtension
擴展描述字段,用于描述擴展的屬性、設置等。作為一個擴展項目必須要包含此字段。
NSExtensionAttributes
擴展屬性集合字段。用于描述擴展的屬性。
NSExtensionActivationRule
激活擴展的規則。默認為字符串“TRUEPREDICATE”,表示在分享菜單中一直顯示該擴展。可以將類型改為Dictionary類型,然后添加以下字段:
NSExtensionActivationSupportsAttachmentsWithMaxCount
NSExtensionActivationSupportsAttachmentsWithMinCount
NSExtensionActivationSupportsImageWithMaxCount
NSExtensionActivationSupportsMovieWithMaxCount
NSExtensionActivationSupportsWebPageWithMaxCount
NSExtensionActivationSupportsWebURLWithMaxCount
NSExtensionMainStoryboard
設置主界面的Storyboard,如果不想使用storyboard,也可以使用NSExtensionPrincipalClass指定自定義UIViewController子類名
NSExtensionPointIdentifier
擴展標識,在分享擴展中為:com.apple.share-services
NSExtensionPrincipalClass
自定義UI的類名
NSExtensionActivationSupportsAttachmentsWithMaxCount
附件最多限制,為數值類型。附件包括File、Image和Movie三大類,單一、混選總量不超過指定數量
NSExtensionActivationSupportsAttachmentsWithMinCount
附件最少限制,為數值類型。當設置NSExtensionActivationSupportsAttachmentsWithMaxCount時生效,默認至少選擇1個附件,分享菜單中才顯示擴展插件圖標。
NSExtensionActivationSupportsFileWithMaxCount
文件最多限制,為數值類型。文件泛指除Image/Movie之外的附件,例如【郵件】附件、【語音備忘錄】等。單一、混選均不超過指定數量。
NSExtensionActivationSupportsImageWithMaxCount
圖片最多限制,為數值類型。單一、混選均不超過指定數量。
NSExtensionActivationSupportsMovieWithMaxCount
視頻最多限制,為數值類型。單一、混選均不超過指定數量。
NSExtensionActivationSupportsText
是否支持文本類型,布爾類型,默認不支持。如【備忘錄】的分享
NSExtensionActivationSupportsWebURLWithMaxCountWeb
鏈接最多限制,為數值類型。默認不支持分享超鏈接,需要自己設置一個數值。
NSExtensionActivationSupportsWebPageWithMaxCount
Web頁面最多限制,為數值類型。默認不支持Web頁面分享,需要自己設置一個數值。
對于不同的應用里面有可能出現只允許接受某種類型的內容,那么Share Extension就不能一直出現在分享菜單中,因為不同的應用提供的分享內容不一樣,這就需要通過設置NSExtensionActivationRule字段來決定Share Extension是否顯示。例如,只想接受其他應用分享鏈接到自己的應用,那么可以通過下面的步驟來設置:
將NSExtensionActivationRule字段類型由String改為Dictionary。
展開NSExtensionActivationRule字段,創建其子項NSExtensionActivationSupportsWebURLWithMaxCount,并設置一個限制數量。
2.3 處理Share Extension中的數據
頂部包含取消和分享兩個按鈕同時在插件中也包含兩個對應方法
- (void)didSelectCancel;
- (void)didSelectPost
在這兩個方法里面可以進行一些自定義的操作。一般情況下,當用戶點擊提交按鈕的時候,擴展要做的事情就是要把數據取出來,并且放入一個與Containing App(容器程序,盡管蘋果開放了Extension,但是在iOS中extension并不能單獨存在,要想提交到AppStore,必須將Extension包含在一個App中提交,并且App的實現部分不能為空,這個包含Extension的App就叫Containing app。Extension會隨著Containing App的安裝而安裝,同時隨著ContainingApp的卸載而卸載。**)共享的數據介質中(包括NSUserDefault、Sqlite、CoreData),要跟容器程序進行數據交互需要借助AppGroups服務.下一篇我們會講到如何實現我們的主程序和拓展程序之間的通訊。