当另一个应用程序错误地定义 UTI 时如何解决



本主题主要与iOS有关,尽管它可能也适用于OS X。

我在应用程序的UTImportedTypeDeclarations中放置了一个声明,说.md扩展(以及其他扩展名)属于UTI net.daringfireball.markdown。这个UTI是由Markdown的最初作者推荐的,因此被认为是规范的。

然后我使用UIDocumentPickerViewController从Dropbox打开一个Markdown文件,间接使用Dropbox的应用程序扩展。在创建该控制器时,我特意将net.daringfireball.markdown作为接受的 UTI 之一传递。

令我惊讶的是,该行动返回的UTI pro.writer.markdown。而我的代码期望net.daringfireball.markdown确定返回的文件是否确实是 Markdown 文件。对于我的应用程序,pro.writer.markdown没有被识别,事实上它不在UIDocumentPickerViewController选择的 UTI 列表中。

经过进一步调查,我手机中的另一个应用程序在其UTExportedTypeDeclarations列表中声明pro.writer.markdown。该应用程序是iA Writer。

现在解决这个问题的最佳方法是什么?这些是我现在想到的:

  • 承认失败并在另一个UTI中添加"或"子句:

    //...
    else if(UTTypeConformsTo(fileUTI,@"net.daringfireball.markdown") || UTTypeConformsTo(fileUTI,@"pro.writer.markdown")) {
     ... // handle Markdown file
    
  • 回退到纯文本的"超类"UTI:

    //...
    else if(UTTypeConformsTo(fileUTI,@"net.daringfireball.markdown") || UTTypeConformsTo(fileUTI,kUTTypePlainText)) {
     ... // handle Markdown file
    

第一个缺点是我需要列出所有其他应用程序对 Markdown 的错误声明。第二个似乎更合理,但我想知道我是否忽略了什么?

还是有比这两者更好的选择?

一种选择是检查所选文件的文件扩展名。

- (void)documentPicker:(UIDocumentPickerViewController *)controller didPickDocumentAtURL:(NSURL *)url {
    NSString *fileUTI = ...
    if ([url.pathExtension isEqualToString:@"md"] || UTTypeConformsTo(fileUTI, @"net.daringfireball.markdown")) {
    }
}

最新更新