这个主题主要是关于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声明。第二个似乎更合理,但我想知道我是否忽略了什么?
还是有比这两个更好的选择吗?
答案 0 :(得分:1)
一种选择是检查所选文件的文件扩展名。
- (void)documentPicker:(UIDocumentPickerViewController *)controller didPickDocumentAtURL:(NSURL *)url {
NSString *fileUTI = ...
if ([url.pathExtension isEqualToString:@"md"] || UTTypeConformsTo(fileUTI, @"net.daringfireball.markdown")) {
}
}