文件类型处理是 iPhone OS 3.2 的新功能,与现有的自定义 URL 方案不同。您可以注册您的应用程序来处理特定的文档类型,并且任何使用文档控制器的应用程序都可以将这些文档的处理交给您自己的应用程序。
例如,我的应用程序Molecules(提供源代码)处理 .pdb 和 .pdb.gz 文件类型,如果通过电子邮件或其他支持的应用程序接收。
要注册支持,您需要在 Info.plist 中包含以下内容:
<key>CFBundleDocumentTypes</key>
<array>
<dict>
<key>CFBundleTypeIconFiles</key>
<array>
<string>Document-molecules-320.png</string>
<string>Document-molecules-64.png</string>
</array>
<key>CFBundleTypeName</key>
<string>Molecules Structure File</string>
<key>CFBundleTypeRole</key>
<string>Viewer</string>
<key>LSHandlerRank</key>
<string>Owner</string>
<key>LSItemContentTypes</key>
<array>
<string>com.sunsetlakesoftware.molecules.pdb</string>
<string>org.gnu.gnu-zip-archive</string>
</array>
</dict>
</array>
提供了两个图像,它们将用作邮件和其他能够显示文档的应用程序中支持的类型的图标。 LSItemContentTypes 键允许您提供应用程序可以打开的统一类型标识符 (UTI) 数组。有关系统定义的 UTI 列表,请参阅 Apple 的 Uniform Type Identifiers Reference。有关 UTI 的更多详细信息,请参阅 Apple 的 Uniform Type Identifiers Overview。这些指南位于 Mac 开发人员中心,因为此功能已从 Mac 移植过来。
上述示例中使用的一个 UTI 是系统定义的,但另一个是特定于应用程序的 UTI。需要导出特定于应用程序的 UTI,以便系统上的其他应用程序可以知道它。为此,您需要在 Info.plist 中添加一个部分,如下所示:
<key>UTExportedTypeDeclarations</key>
<array>
<dict>
<key>UTTypeConformsTo</key>
<array>
<string>public.plain-text</string>
<string>public.text</string>
</array>
<key>UTTypeDescription</key>
<string>Molecules Structure File</string>
<key>UTTypeIdentifier</key>
<string>com.sunsetlakesoftware.molecules.pdb</string>
<key>UTTypeTagSpecification</key>
<dict>
<key>public.filename-extension</key>
<string>pdb</string>
<key>public.mime-type</key>
<string>chemical/x-pdb</string>
</dict>
</dict>
</array>
此特定示例导出带有 .pdb 文件扩展名的 com.sunsetlakesoftware.molecules.pdb UTI,对应于 MIME 类型 chemical/x-pdb。
有了这个,您的应用程序将能够处理附加到电子邮件或系统上其他应用程序的文档。在 Mail 中,您可以点击并按住以调出可以打开特定附件的应用程序列表。
打开附件后,您的应用程序将启动,您需要在-application:didFinishLaunchingWithOptions: 应用程序委托方法中处理此文件。看起来,以这种方式从 Mail 加载的文件被复制到应用程序的 Documents 目录中,该目录下的子目录与它们到达的邮箱相对应。您可以使用如下代码在应用程序委托方法中获取此文件的 URL:
NSURL *url = (NSURL *)[launchOptions valueForKey:UIApplicationLaunchOptionsURLKey];
请注意,这与我们用于处理自定义 URL 方案的方法相同。您可以使用如下代码将文件 URL 与其他 URL 分开:
if ([url isFileURL])
{
// Handle file being passed in
}
else
{
// Handle custom URL scheme
}