文件类型处理是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>
提供了两个图像,它们将用作Mail和其他能够显示文档的应用程序中支持的类型的图标.LSItemContentTypes
键允许您提供应用程序可以打开的统一类型标识符(UTI)array.有关系统定义的UTI的列表,请参阅苹果的Uniform Type Identifiers Reference.关于UTI的更多细节可以在苹果的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>
此特定示例将com.sunsetlakesoftware.molecules.pdb
UTI导出为.pdb文件扩展名,对应于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
}