如何将文件类型与iPhone应用关联起来?
问题的原因是Safari无法打开自定义文件类型".icz",尽管已经尝试了一些方法。作者发现可以使用一些UT* C函数来探索各种事物,并找到了正确的解决方法。作者在应用程序加载时添加了一行代码来获取UTI和bundle URL,并发现UTI是正确的,而bundle URL指向应用程序的文件夹。然而,Dropbox返回的MIME类型为"text/calendar",但即使将"text/calendar"添加到应用程序的MIME类型中,仍然无法正常工作。作者尝试获取"text/calendar"的UTI和bundle URL,并发现UTI是"com.apple.ical.ics",bundle URL是".../MobileCoreTypes.bundle/",并没有指向作者的应用程序。作者尝试将"com.apple.ical.ics"添加到LSItemContentTypes和UTConformsTo中,但仍然无法正常工作。因此,如果苹果认为他们想要处理某种文件类型,你将不得不更改文件扩展名,因为他们不允许你处理该文件类型。
问题原因:在iOS 4.2.1版本上,当从邮件应用程序中打开自定义文件时,如果附件已经被打开过,应用程序不会被触发或通知。虽然会出现“打开方式…”的弹出窗口,但却什么也不做。
解决方法:通过(重新)从收件箱目录中移除文件来解决此问题。一个安全的方法似乎是在文件被打开时(在-(BOOL)application:openURL:sourceApplication:annotation:
中)同时移除文件,以及在applicationDidBecomeActive:
中遍历Documents/Inbox目录并删除所有项目。最后这个综合方法可能需要让应用程序重新回到一个干净的状态,以防止之前的导入导致崩溃或中断。
我没有看到这种行为。如果我的应用程序在后台运行,-(BOOL)application:openURL:sourceApplication:annotation:
总是被调用,即使附件已经被打开过。每次附件被打开时,文件名后面会加上一个数字,并递增以保证唯一性--例如test.text,test-1.txt,test-2.txt等。
我的收件箱目录是空的,但我仍然有你所说的无响应的“在Safari中打开”按钮。几年前,我的应用程序运行良好,但突然间停止工作了。我怀疑苹果在Safari中做了一些改变。
如何将文件类型与iPhone应用程序相关联?
在iPhone OS 3.2中,文件类型处理是新的,并且不同于已经存在的自定义URL schemes。您可以注册应用程序以处理特定的文档类型,并且使用文档控制器的任何应用程序都可以将这些文档的处理交给您自己的应用程序。
例如,我的应用程序Molecules(源代码可用)可以处理.pdb和.pdb.gz文件类型,如果通过电子邮件或其他支持的应用程序接收到。
要注册支持,您需要在Info.plist中添加以下内容:
CFBundleDocumentTypes CFBundleTypeIconFiles Document-molecules-320.png Document-molecules-64.png CFBundleTypeName Molecules Structure File CFBundleTypeRole Viewer LSHandlerRank Owner LSItemContentTypes com.sunsetlakesoftware.molecules.pdb org.gnu.gnu-zip-archive
在Mail和其他能够显示文档的应用程序中,提供了两个图像,用作支持的类型的图标。`LSItemContentTypes`键允许您提供一个统一类型标识符(UTI)数组,您的应用程序可以打开这些文档。有关系统定义的UTI列表,请参阅苹果的统一类型标识符参考。有关UTI的更多详细信息,请参阅苹果的统一类型标识符概述。这些指南位于Mac开发者中心,因为这个功能已经从Mac移植过来。
上面示例中使用的UTI之一是系统定义的,但另一个是特定于应用程序的UTI。应用程序特定的UTI需要导出,以便系统上的其他应用程序能够意识到它。为此,您需要在Info.plist中添加以下部分:
UTExportedTypeDeclarations UTTypeConformsTo public.plain-text public.text UTTypeDescription Molecules Structure File UTTypeIdentifier com.sunsetlakesoftware.molecules.pdb UTTypeTagSpecification public.filename-extension pdb public.mime-type chemical/x-pdb
这个特定的示例使用了与.pdb文件扩展名对应的MIME类型chemical/x-pdb导出了`com.sunsetlakesoftware.molecules.pdb` UTI。
有了这个设置,您的应用程序将能够处理附加到电子邮件或系统上其他应用程序的文档。在Mail中,您可以长按来显示可以打开特定附件的应用程序列表。
当打开附件时,您的应用程序将启动,并且您需要在`-application:didFinishLaunchingWithOptions:`应用程序代理方法中处理这个文件的处理。从Mail加载的文件似乎被复制到您的应用程序的文档目录下的与其所在的电子邮件箱对应的子目录中。您可以使用如下代码在应用程序代理方法中获取此文件的URL:
NSURL *url = (NSURL *)[launchOptions valueForKey:UIApplicationLaunchOptionsURLKey];
请注意,这与我们处理自定义URL schemes时使用的方法相同。您可以使用以下代码将文件URL与其他类型分开:
if ([url isFileURL]) { // 处理传入的文件 } else { // 处理自定义URL scheme }
请注意,此内容中的一些参考链接可能需要登录或查看苹果开发者中心。
这个问题的出现可能是因为开发者想要将特定的文件类型与他们的iPhone应用程序关联起来。他们想知道如何通过修改Info.plist文件来实现这一目标。通过在Info.plist中添加适当的键值对,开发者可以注册他们的应用程序以处理特定的文件类型。然后,其他应用程序可以通过文档控制器将这些文件类型的处理交给开发者的应用程序。通过以下步骤,开发者可以实现将文件类型与iPhone应用程序关联起来:
1. 在Info.plist中添加CFBundleDocumentTypes键和数组。在数组中,添加一个字典,其中包含以下键值对:
- CFBundleTypeIconFiles:提供用于邮件和其他支持显示文档的应用程序的图标的图像数组。
- CFBundleTypeName:文件类型的名称。
- CFBundleTypeRole:应用程序在处理文件时的角色。
- LSHandlerRank:应用程序在处理文件时的优先级。
- LSItemContentTypes:应用程序可以打开的统一类型标识符(UTI)的数组。
2. 为每个支持的文件类型添加一个字典,其中包含以下键值对:
- UTTypeConformsTo:应用程序支持的其他UTI的数组。
- UTTypeDescription:文件类型的描述。
- UTTypeIdentifier:文件类型的唯一标识符。
- UTTypeTagSpecification:文件类型的标签规范字典,包括文件扩展名和MIME类型。
3. 在应用程序代理方法`-application:didFinishLaunchingWithOptions:`中处理文件的处理。可以使用`UIApplicationLaunchOptionsURLKey`键获取文件的URL。
通过遵循这些步骤,开发者可以成功将文件类型与他们的iPhone应用程序关联起来,并处理从邮件和其他应用程序接收到的文件。