2016-01-21 21 views
1

本主題主要關於iOS,但它也適用於OS X。如何解決另一個應用程序錯誤定義UTI的問題?

我已經在我的應用程序的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列表中。

經過進一步調查,我手機中的另一個應用程序在其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 
    

第一個有我需要列出每往下其他應用程序的Mar的不正確申報下行kdown。第二個似乎更合理,但我想知道我是否忽略了某些東西?

還是有比這兩個更好的選擇?

回答

1

一個選項是檢查所選文件的文件擴展名。

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

是的,你說得對。返回*純文本*如果另一個應用程序錯誤地聲明瞭擴展名並且沒有正確設置UTI分層結構,則UTI將不起作用。在任何情況下,文件擴展名都是確定從外部文件系統獲取文件時的類型的標準來源。 – adib

相關問題