0

当我尝试从 Mail 中将文件导出到我的应用程序时,它正在发送文件以使用错误的扩展名导出。

这是一个例子:

  1. 我通过电子邮件将附件发送给自己
  2. 在邮件中打开附件
  3. 导出文件并使用我的应用程序打开
  4. 传递给 application:handleOpenUrl: 的 url 错误

我尝试导出的文件名为“NSIS.nsi”(不带引号)。邮件(iOS?)通过应用程序将文件传递回我的应用程序时将文件重命名为“NSIS.4th”:handleOpenUrl。我注意到的一件事是 Exported Type UTIs > Item 0 > Conforms to UTIs > Equivalent Types > public.filename-extension 中的第一个扩展名(项目)是“4th”(同样,没有引号)。

另一件需要注意的是,我在同一个 public.filename-extension 数组中确实有“nsi”扩展名。

还有一点需要注意的是,这似乎只发生在“nsi”扩展名中。我还没有测试我的应用程序支持的所有扩展(有 92 个。大约第 40 个后我就累了)。但是这个扩展特别有问题。

顺便说一下,这里是代码示例……真的就是这么简单。传递的 NSURL 包含错误的扩展名。这将记录传递的 url - 这是错误的。因此,我可以肯定地说,在将 NSURL 传递给 application:handleOpenUrl: 之前,我的应用程序中没有任何东西在使用它。

- (BOOL)application:(UIApplication *)application handleOpenURL:(NSURL *)url
{
    NSLog(@"url: %@", url);
    ...
}

我也不知道这是否有帮助,但在邮件应用程序中,它确实在 NSIS.nsi 文件旁边显示了我的应用程序图标。是的,文件名在 Mail 中显示为“NSIS.nsi”。

更新 2

我能够确认将第一个扩展名更改为“5th”(用于踢球),然后导入“NSIS.nsi”文件,它确实将文件扩展名更改为“NSIS.5th”。我认为正在发生的事情是我正在定义我的应用程序不正确支持的 UTI。我只想说,“嘿,iOS,我支持所有这些文件扩展名。不要更改名称。只要给我文件,让我做我需要做的事情。” 实际上,我只是希望我的应用程序支持所有类型的文本文件(文本、utf8、utf16 等)。这就是最终结果。

问题是,当我告诉 iOS 我支持纯文本、utf8 和 utf16 时,它仍然不会在可以打开文件的应用程序列表中显示我的应用程序,除非我在 public.filename-extension 数组中专门设置了扩展名. 我希望 plist 中只有一个包罗万象的“我支持所有文本文件”配置值。

我注意到的另一件事是该问题确实会影响其他文件扩展名。例如,我有一个文件要从 Mail 导出到我的应用程序,名为“Ada.adb”。iOS 将文件作为“Ada.ada”返回(注意末尾的“a”而不是“b”)。这是有道理的......我什至在 public.filename-extension 数组或我的应用程序中的任何地方的文件扩展名列表中都没有'ada'。

更新 3

我想出了如何支持所有类型的 public.text 文件。

<key>CFBundleDocumentTypes</key>
<array>
    <dict>
        <key>CFBundleTypeIconFiles</key>
        <array>
            <string>icon_buffer_ipad_small.png</string>
            <string>icon_buffer_iphone_small.png</string>
        </array>
        <key>LSItemContentTypes</key>
        <array>
            <string>public.text</string>
        </array>
        <key>NSExportableTypes</key>
        <array>
            <string>public.text</string>
        </array>
        <key>CFBundleTypeName</key>
        <string>Source File</string>
        <key>LSHandlerRank</key>
        <string>Default</string>
    </dict>
</array>

本质上,除了LSItemContentTypes之外,您还需要包含NSExportableTypes。当我弄清楚如何制作其他“public.text”文件类型(例如 4th、md 以及与您的应用程序相关联的 public.text 其他文件类型的巨大列表)时,我将添加更新。希望这不是必需的。无论如何,我会更新我的发现。

更新 4

你们不会相信这个的。这个问题会影响我测试过的每个应用程序。本质上,当我尝试导出“Ada.adb”文件时,它会将文件作为“Ada.ada”导出到每个应用程序。哇!我要弄清楚如何向Apple提交这个错误。当然,除非这是预期的行为!

小更新:我将错误提交给 Apple。错误 ID# 12802236

我不记得这发生在 iOS 5 中。我相信这是 iOS 6 中引入的回归。

4

1 回答 1

0

如果文件名没有改变,那么在- (BOOL)application:(UIApplication *)application handleOpenURL:(NSURL *)url收到文件后手动更改其扩展名如何url?当然,您必须知道正确的扩展名是什么。

于 2012-12-04T00:55:47.480 回答