有iPhone应用程序“另一个邮件客户端”应该能够打开任何文件作为附件发送它。所以,我想将此应用程序与任何扩展名的文件相关联。
在文档之后,我们应声明对具有根UTI类型public.data
的文件的支持 - 任何文件都应属于此类型。它有效,但根本没有。在这种情况下,我们的应用程序将无法打开任何文件,只能打开已在系统中注册的文件。例如,如果在任何应用程序(例如,dropbox)中我们将尝试使用UIDocumentInteractionController以未知扩展名(file.unknowntype)“打开...”文件,那么尽管我们已经已经存在,但答案将是否定的注册了我们的应用程序,它支持根UTI类型public.data
。但是,如果您安装另一个支持带扩展名(* .unknowntype)的文件的应用程序,那么我们的应用程序也可以打开这些文件并显示在“打开...”应用程序列表中。
UPD: @Gabriel这是我的info.plist文件的CFBundleDocumentTypes的一部分:
<key>CFBundleDocumentTypes</key>
<array>
<dict>
<key>CFBundleTypeName</key>
<string>MyMail</string>
<key>LSItemContentTypes</key>
<array>
<string>public.data</string>
</array>
<key>CFBundleTypeRole</key>
<string>Viewer</string>
<key>LSHandlerRank</key>
<string>Default</string>
<key>CFBundleTypeIconFiles</key>
<array>
<string>Icon29.png</string>
...
<string>Icon114.png</string>
</array>
</dict>
</array>
答案 0 :(得分:2)
我使用以下设置制作了应用
<key>CFBundleDocumentTypes</key>
<array>
<dict>
<key>CFBundleTypeIconFiles</key>
<array/>
<key>CFBundleTypeName</key>
<string>name</string>
<key>LSItemContentTypes</key>
<array>
<string>public.data</string>
</array>
</dict>
</array>
当我尝试从Safari打开.pdf时,此应用程序显示在“打开...”列表中。你可以制作一个示例应用程序并尝试一下吗?
UPD:
似乎声称'public.data'(也试过public.item,public.content)表示文件,它属于设置“系统UTI都知道”,而不是任何文件。因此,您将能够处理用户希望通过电子邮件发送的99% of files,但不是全部。另一种方法是导出您认为重要的UTI,但默认情况下不在系统UTI中。
答案 1 :(得分:0)
朋友,我在发布答案之前正确地阅读了你的问题。我再次想到你将拥有一组已知的“任何类型”的文件来批量注册。但是,您希望动态调整应用程序以注册将来为您的应用程序提供的任何文件类型并使其可连接。就我的知识而言,你不能让你的应用程序普遍支持任何未知的文件类型。让我解释一下会发生什么,
假设您创建了一个应用程序APP1,那么它不知道文件扩展名.XYZ并将其安装在iPhone上。
但是,后来我开发了另一个应用程序APP2,它包含上面的代码,我在它安装的iPhone中注册了APP2的.XYZ类型。
所以,让我说我在你的iPhone上安装APP2,有APP1。当我的应用程序运行时,.XYZ扩展名(提前知道APP2)将被注册到iPhone中。
这就是现在你的应用APP1可以令人惊讶地使用这个.XYZ文件的原因。
总结一下,在制作应用程序之前,您必须提前了解特定类型的扩展程序。
然而,这是一个可能的解决方案。
解决方案:
确定扩展中要支持的最大字符数。让我们说4。
现在,您可以在应用程序中运行一个小的Brute-Force例程,以创建所有可能的字符组合并将它们全部注册。这应该使任何扩展名最多4个字符的文件可以附加到邮件中。
我希望能做到这一点。
祝你好运!
答案 2 :(得分:0)
调查的想法......
如果另一个应用程序的安装“修复”了该问题,请尝试检查其他应用程序Info.plist文件,以查看它是注册还是导出任何有趣的UTI
或类似设置。
听起来你的应用程序可能只做了一半的工作而另一个应用程序正在完成缺少的设置。
您可以通过复制ipa
来检查应用iTunes
文件的内容,将ipa
重命名为zip
,然后提取内容Show Package Contents
里面的应用程序。