本主题主要与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")) {
}
}