在iOS应用中注册GPX(或XML)文件以打开

20

我在我的iOS应用程序中无法打开GPX文件。我注册了扩展名,一些文件可以正确打开,即当我在Safari中点击GPX文件链接时,它会显示一个提示,询问我想要使用哪个应用程序来打开该文件。然后我选择我的应用程序,文件会按预期处理。但是对于一些网站和所有来自电子邮件附件的文件,未显示提示和应用程序选择,浏览器/电子邮件应用程序将文件内容显示为文本。

我怀疑这可能是info.plist设置或Safari和电子邮件应用程序的问题。如果您能够在您的iOS应用程序中正确打开XML或GPX文件,请在info.plist中发布CFBundleDocumentTypes和UTExportedTypeDeclarations设置。

欢迎任何想法。这是我的info.plist中的适当部分。我尝试添加和删除一些可选标签,这是最新的,但不是最完整的。

<key>CFBundleDocumentTypes</key>
<array>
    <dict>
        <key>CFBundleTypeIconFiles</key>
        <array>
            <string>Icon.png</string>
            <string>Icon@2x.png</string>
        </array>
        <key>CFBundleTypeName</key>
        <string>GPS eXchange Format</string>
        <key>CFBundleTypeRole</key>
        <string>Viewer</string>
        <key>LSHandlerRank</key>
        <string>Owner</string>
        <key>LSItemContentTypes</key>
        <array>
            <string>org.elsners.Indicium.gpx</string>
        </array>
    </dict>
</array>
<key>UTExportedTypeDeclarations</key>
<array>
    <dict>
        <key>UTTypeConformsTo</key>
        <array>
            <string>public.xml</string>
        </array>
        <key>UTTypeDescription</key>
        <string>GPS eXchange Format</string>
        <key>UTTypeIdentifier</key>
        <string>org.elsners.Indicium.gpx</string>
        <key>UTTypeTagSpecification</key>
        <dict>
            <key>public.filename-extension</key>
            <array>
                <string>GPX</string>
                <string>gpx</string>
            </array>
        </dict>
    </dict>
</array>

Mirek,你解决这个问题了吗?能否发一篇文章给那些仍在寻找答案的人呢? - mstenroos
抱歉,我没有找到解决方案。通过电子邮件附件,它显示正确的图标,但是当我点击它时,它作为文本文件打开。 - MirekE
最新的斯坦福课程正是关于这个主题!他们可能已经发布了示例代码。 - Yariv Nissim
4个回答

1
当处理HTTP内容(例如Safari和Mail应用程序)时,不要忘记处理其内容类型。统一类型标识符(UTI)用于处理内容类型,其值为public.mime-type。假设服务器响应的内容类型标头设置为application/gpx,则必须在plist中向UTTypeTagSpecification部分添加以下内容:
<dict>
  <key>public.filename-extension</key>
   <array>
     <string>GPX</string>
     <string>gpx</string>
   </array>
   <key>public.mime-type</key>
   <string>application/gpx</string>
</dict>

注意:我在网上看到过用于GPX数据的内容类型为application/gpxapplication/gpx+xml,我不知道是否有标准的MIME类型,因此最好两种都使用。

0
我认为以下部分必须被删除:
<key>UTTypeConformsTo</key>
<array>
    <string>public.xml</string>
</array>

我复现了这个问题,并通过删除来修复它。

显然,邮件应用程序认为它可以比其他应用程序更好地处理符合XML标准的类型,并拦截处理过程。

我还建议包括Wallace Campos发布的答案中的更改。


0

尝试这段代码...

(BOOL)application:(UIApplication *)application openURL:(NSURL *)url sourceApplication:(NSString *)sourceApplication annotation:(id)annotation
{

    if (url != nil && [url isFileURL]) {

        //  xdxf file type handling

        if ([[url pathExtension] isEqualToString:@"xdxf"]) {

            NSLog(@"URL:%@", [url absoluteString]);

        }

    }

    return YES;
}

嗨,Jaffer,感谢您的评论。我的应用程序中有类似的代码。您提供的代码示例将处理文件,但原始问题是当用户在另一个应用程序中激活GPX文件时,应用程序未启动。 - MirekE

0

我曾经遇到过类似的问题。我的应用程序没有显示在邮件应用程序中打开XML附件的应用程序列表中。我在info.plist中使用了以下代码,这对我很有效:

<key>CFBundleDocumentTypes</key>
    <array>
      <dict>
        <key>CFBundleTypeName</key>
        <string>XML File</string>
        <key>LSHandlerRank</key>
        <string>Default</string>
        <key>CFBundleTypeRole</key>
        <string>Viewer</string>
        <key>LSItemContentTypes</key>
        <array>
          <string>public.XML</string>
        </array>
        <key>CFBundleTypeIconFiles</key>
        <array>
          <string>Sandbox-icon.png</string>
        </array>
      </dict>
    </array>

参考:http://iosdevelopertips.com/core-services/how-to-register-file-types-supported-by-an-ios-app.html


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接