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

时间:2016-01-21 15:19:35

标签: ios cocoa-touch uti

这个主题主要是关于iOS的,虽然它也可能适用于OS X.

我已在我的应用UTImportedTypeDeclarations中发出声明,声称.md扩展程序(以及其他扩展程序)属于UTI net.daringfireball.markdown。这个UTI是recommended by Markdown's initial author,因此被认为是规范的。

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

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

经过进一步调查后,我手机中的另一个应用会在其pro.writer.markdown列表中声明UTExportedTypeDeclarations。该应用程序是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声明。第二个似乎更合理,但我想知道我是否忽略了什么?

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

1 个答案:

答案 0 :(得分:1)

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

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