天天看點

UIDocumentInteractionController之程式間文檔共享

ios中的沙盒可以讓平台更加的安全,這也是沙盒給使用者帶來的最主要好處。不過由于沙盒的嚴格限制,導緻程式之間共享資料比較麻煩。一般在程式間共享文檔可以通過uidocumentinteractioncontroller類實作通訊。它支援在你的app中用其他app預覽和顯示文檔。同時也支援檔案關聯,允許其他app通過你的程式打開檔案。這些技術包括了uikit中提供的uidocumentinteractioncontroller類(uidocumentinteractioncontroller class reference),以及quick look架構(quick look framework reference)。

本文将就如何在應用之間進行檔案共享進行基本探究。還請大牛勿噴。

蘋果官方文檔

UIDocumentInteractionController之程式間文檔共享
UIDocumentInteractionController之程式間文檔共享

如果你的app需要打開它不支援的檔案(pdf檔案、圖像檔案,等等),或者需要将app的檔案傳輸給另外一個允許接收此類型檔案的app時。可以使用檔案互動控制器(uidocumentinteractioncontroller類的執行個體)為使用者提供可接收程式來處理檔案,說的簡單點就是通過quick look架構判斷文檔是否能被另一個app打開和預覽。

uidocumentinteractioncontroller在ios3.2中就已經存在了,使用起來非常靈活,功能也比較強大。它除了支援同裝置上app之間的文檔共享外,還可以實作文檔的預覽、列印、發郵件以及複制。

要使用一個檔案互動控制器(uidocumentinteractioncontroller類的執行個體),需要以下步驟:

為每個你想打開的檔案建立一個uidocumentinteractioncontroller類的執行個體

實作uidocumentinteractioncontrollerdelegate代理

顯示預覽視窗/顯示菜單。

documentinteraction controller使用靜态方法interactioncontrollerwithurl建立執行個體,這個方法使用一個nsurl作為參數。

document interaction controller對象使用presentpreviewanimated方法彈出一個全屏的文檔預覽視窗。

如果你不想在本應用裡面打開檔案,那麼可以通過第三方應用打開預覽檔案。通過<code>optionsmenu</code>(選項菜單),顯示能夠接收該類型檔案的應用,由使用者選擇相應的操作。

顯示菜單可以使用下列方法:

這些方法都是類似的,隻是顯示位置有差別而已。以下代碼示範其中一個方法的使用。

如果你顯示一個document interaction controller ,則必需要為delegate屬性用指定一個委托。讓委托告訴documentinteraction controller如何顯示。

委托對象需要實作一系列委托方法,最常見的包括:

這3個方法在使用者點選“快速檢視”菜單時依次調用。

如果你的程式能夠打開某種檔案,你可以向系統進行注冊。友善其他程式通過 ios 的<code>document interaction</code>技術提供給使用者一個選擇,進而調用你的程式處理這些檔案。 這需要在程式的<code>info.plist</code>檔案中添加<code>cfbundledocumenttypes</code>鍵(檢視corefoundation keys)。 系統将該鍵中包含的内容進行登記,這樣其他程式就可以通過<code>document interaction controller</code>通路到這些資訊。 <code>cfbundledocumenttypes</code>鍵是一個dictionary數組,每個dictionary表示了一個指定的文檔類型。一個文檔類型通常與某種檔案類型是一一對應的。 但是,如果你的程式對多個檔案類型采用同樣的處理方式,你也可以把這些類型都分成一個組,統一視作一個文檔類型。例如,你的程式中使用到的本地文檔類型,有一個是舊格式的,還有一個新格式(似乎是影射微軟office文檔),則你可以将二者分成一組,都放到同一個文檔類型下。這樣,舊格式和新格式的檔案都将顯示為同一個文檔類型,并以同樣的方式打開。

<code>cfbundledocumenttypes</code>數組中的每個 dictionary 可能包含以下鍵:

cfbundletypename

指定文檔類型名稱。

cfbundletypeiconfiles

是一個數組,包含多個圖檔檔案名,用于作為該文檔的圖示。

lsitemcontenttypes

是一個數組,包含多個<code>uti</code>【uniform type identifiers】類型的字元串。<code>uti</code>類型是本文檔類型(組)所包含的檔案類型。

lshandlerrank

表示應用程式是“擁有”還是僅僅是“打開”這種類型而已。

下表列出了<code>info.plist</code>中的一個<code>cfbundletypename</code>官方示例。

自定義檔案格式的文檔類型

自己程式配置檔案

你可以在應用程式委托的<code>application:didfinishlaunchingwithoptions:</code>方法中獲得該檔案的資訊。如果你的程式要處理某些自定義的檔案類型,你必須實作這個委托方法(而不是applicationdidfinishlaunching: 方法) 并用這個方法啟動應用程式。

<code>application:didfinishlaunchingwithoptions:</code>方法的<code>option</code>參數包含了要打開的檔案的相關資訊。尤其需要在程式中關心下列鍵:

uiapplicationlaunchoptionsurlkey

包含了該檔案的nsurl。

uiapplicationlaunchoptionssourceapplicationkey

包含了發送請求的應用程式的 bundle id。

uiapplicationlaunchoptionsannotationkey

包含了源程式向目标程式傳遞的與該檔案相關的屬性清單對象。

如果<code>uiapplicationlaunchoptionsurlkey</code>鍵存在,你的程式應當立即用該 url 打開該檔案并将内容呈現給使用者。其他鍵可用于收集與打開的檔案相關的參數和資訊。

如果你的應用程式處于活躍狀态,此時<code>application:didfinishlaunchingwithoptions:</code>方法是不會被調用的。需要實作<code>application:openurl:options:</code>方法

【以下是本人的寫法】

再一次感謝您花費時間閱讀這篇文章!

微網誌: @danny_呂昌輝

部落格: superdanny

2015 年 12月 26日

繼續閱讀