【问题标题】:How to associate iPhone application with _every_ file type?如何将 iPhone 应用程序与_every_ 文件类型相关联?
【发布时间】:2012-03-10 21:10:21
【问题描述】:

iPhone 应用程序“另一个邮件客户端”应该能够打开任何文件以将其作为附件发送。所以,我想将此应用程序与任何扩展名的任何文件相关联。

根据文档,我们应该声明支持具有根 UTI 类型 public.data 的文件——任何文件都应该属于这种类型。它有效,但根本没有。在这种情况下,我们的应用程序将无法打开任何文件,而只能打开那些已经在系统中注册的文件。例如,如果在任何应用程序(例如,保管箱)中,我们将尝试使用 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>

【问题讨论】:

  • 请向我们展示您的 info.plist 中的 CFBundleDocumentTypes 部分。

标签: iphone objective-c ios


【解决方案1】:

我已经使用以下设置制作了一个应用程序

<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 文件时,此应用程序会显示在“打开方式”列表中。你能制作一个示例应用并尝试一下吗?

更新:

似乎声称'public.data'(也尝试过public.item,public.content)表示文件,它属于“系统UTI已知的所有”集合,而不是任何文件。因此,您将能够处理用户希望通过电子邮件发送的99% of files,但不是全部。另一种方法是导出您认为重要但默认不在系统 UTI 中的 UTI。

【讨论】:

  • 系统默认支持PDF类型,所以没关系。尝试打开具有未知扩展名的文件(例如,*.unknowntype)。
  • 随便用public
【解决方案2】:

朋友,我在发布答案之前正确阅读了您的问题。我给了另一个想法,您将拥有一组已知的“任何类型”的文件来批量注册。但是,您希望动态地适应您的应用程序以注册将来提供给您的应用程序的任何文件类型并使其可附加。为此,据我所知,您不能让您的应用程序普遍支持任何未知文件类型。让我解释一下会发生什么,

  1. 假设您制作了一个应用程序 APP1,但它不知道文件扩展名 .XYZ 并将其安装在 iPhone 上。

  2. 但是,后来我开发了另一个应用程序 APP2,其中包含上面的代码,我在它安装的任何 iPhone 中注册了 APP2 中的 .XYZ 类型。

  3. 所以,假设我在你的 iPhone 上安装了 APP2,有 APP1。当我的应用程序运行时,.XYZ 扩展名(APP2 提前知道)被注册到 iPhone 中。

这就是现在您的应用 APP1 可以惊人地使用这个 .XYZ 文件的原因。

总之,在制作应用程序之前,您必须提前了解特定类型的扩展程序。

但是,这里有一个可能的解决方案。

解决方案:

  1. 确定要在扩展中支持的最大字符数。让我们说 4。

  2. 现在您可以创建一个小型 Brute-Force 例程以在您的应用程序中运行,以生成所有可能的字符组合并将它们全部注册。这应该使任何扩展名最多为 4 个字符的文件都可以附加到邮件中。

我希望这样可以解决问题。

祝你好运!

【讨论】:

  • 您确定要推荐暴力破解 4 个字符吗?这将导致 456976 个注册!按照fspirit's answer! 中的示例,这几乎是 96MB 的 plist 数据!
【解决方案3】:

一个调查的想法......

如果安装另一个应用程序“修复”了问题,然后尝试检查其他应用程序的 Info.plist 文件,看看它是否正在注册或导出任何有趣的UTIs 或类似设置。

听起来您的应用可能只完成了一半的工作,而另一个应用正在完成缺少的设置。

您可以通过复制iTunes 中的应用程序ipa 文件的内容,将其重命名为zip 提取内容,然后在应用程序内部使用Show Package Contents

【讨论】:

    猜你喜欢
    • 2011-02-15
    • 2012-03-18
    • 2012-01-29
    • 1970-01-01
    • 2022-01-11
    • 1970-01-01
    • 2014-05-03
    相关资源
    最近更新 更多