天天看点

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日

继续阅读