Эта тема в основном касается 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. Второй кажется более правдоподобным, но мне интересно, я что-то пропускаю?
Или есть лучшая альтернатива, чем эти два?
Да, вы правы. Вернитесь к * plain text * UTI не будет работать, если другое приложение неправильно заявляет о расширении и не правильно устанавливает иерархию UTI. В любом случае расширение имени файла является каноническим источником для определения типа, когда файл был получен из иностранных файловых систем. – adib