2016-01-21 3 views
1

Эта тема в основном касается iOS, хотя она может применяться и к OS X.Как обойти, когда другое приложение неправильно определяет UTI?

Я разместил объявление в своем приложении UTImportedTypeDeclarations, в котором говорится, что расширение .md (среди прочих) относится к UTI net.daringfireball.markdown. Этот UTI составляет recommended by Markdown's initial author, поэтому считается каноническим.

Затем я использовал UIDocumentPickerViewController, чтобы открыть файл Markdown от Dropbox, косвенно используя расширение приложения Dropbox. При создании этого контроллера я специально передал net.daringfireball.markdown как один из принятых UTI.

К моему удивлению, возвращенный UTI от этого действия был pro.writer.markdown. В то время как мой код ожидал net.daringfireball.markdown, чтобы определить, действительно ли файл был файлом Markdown. К моему приложению pro.writer.markdown не был распознан, и действительно, он не был среди списка UTI, который должен быть выбран UIDocumentPickerViewController.

В ходе дальнейшего расследования другое приложение в моем телефоне объявляет pro.writer.markdown в своем списке UTExportedTypeDeclarations. Приложение является iA Writer.

Теперь, каков был бы лучший способ обойти эту проблему? Это то, что сейчас приходит мне в голову:

  • Признай поражение и добавить «или» оговорка к другому ИМП:

    //... 
    else if(UTTypeConformsTo(fileUTI,@"net.daringfireball.markdown") || UTTypeConformsTo(fileUTI,@"pro.writer.markdown")) { 
    ... // handle Markdown file 
    
  • Падение обратно в «суперкласс» ИМП, который является простым текст:

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

Первый имеет недостаток, что мне нужно, чтобы перечислить вниз неправильное заявление каждого другого приложения с kdown. Второй кажется более правдоподобным, но мне интересно, я что-то пропускаю?

Или есть лучшая альтернатива, чем эти два?

ответ

1

Один из вариантов - проверить расширение файла выбранного файла.

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

Да, вы правы. Вернитесь к * plain text * UTI не будет работать, если другое приложение неправильно заявляет о расширении и не правильно устанавливает иерархию UTI. В любом случае расширение имени файла является каноническим источником для определения типа, когда файл был получен из иностранных файловых систем. – adib