UTI «com.apple» в пользовательском формате файла

#cocoa #plist #document #quicklook #uti

#cocoa #список #документ #быстрый просмотр #uti

Вопрос:

У меня есть приложение на основе документов с пользовательским форматом файла, UTI и тому подобное настроены таким образом:

 <key>CFBundleDocumentTypes</key>
<array>
    <dict>
        <key>CFBundleTypeExtensions</key>
        <array>
            <string>extension</string>
        </array>
        <key>CFBundleTypeIconFile</key>
        <string>Icon</string>
        <key>CFBundleTypeName</key>
        <string>Custom Document</string>
        <key>CFBundleTypeRole</key>
        <string>Editor</string>
        <key>LSHandlerRank</key>
        <string>Default</string>
        <key>NSDocumentClass</key>
        <string>MyDocument</string>
    </dict>
</array>

<key>UTExportedTypeDeclarations</key>
<array>
    <dict>
        <key>UTTypeConformsTo</key>
        <array>
            <string>public.data</string>
        </array>
        <key>UTTypeDescription</key>
        <string>Custom Document</string>
        <key>UTTypeIconFile</key>
        <string>Icon</string>
        <key>UTTypeIdentifier</key>
        <string>com.mycompany.appname</string>
        <key>UTTypeReferenceURL</key>
        <string></string>
        <key>UTTypeTagSpecification</key>
        <dict>
            <key>com.apple.ostype</key>
            <string>XXXX</string>
            <key>public.filename-extension</key>
            <array>
                <string>extension</string>
            </array>
        </dict>
    </dict>
</array>
<key>UTImportedTypeDeclarations</key>
<array/>
  

Который (я предполагаю, основываясь на том, что я прочитал) является правильным способом сделать это.
За исключением того, что, когда я запускаю mdls для любых сохраненных файлов, UTI отображается как:

 kMDItemContentType             = "com.apple.appname.document"
  

Это сбивает с толку, поскольку я буквально скопировал и вставил записи из списков примеров приложений, таких как TextEdit, iSpend и Sketch, все безрезультатно.

Особенно важно, чтобы сохраненные документы имели правильный UTI, потому что им нужен пользовательский генератор QuickLook, который полагается на правильный UTI.

Любая помощь приветствуется. Заранее благодарю вас.

Комментарии:

1. Создали ли вы пользовательское расширение для своих UTI?

Ответ №1:

Делали ли вы в какой-то момент следующее:

1) В какой-то момент в качестве вашего типа UTI был указан com.apple.appname.document , и в это время вы создали пользовательский документ вашего типа в файловой системе.

3) Затем вы изменили настройки UTI в своем приложении.

4) Вы просматриваете информацию о файле, который вы создали на шаге 1, и этот файл не изменился с момента его создания?

Если это так, попробуйте использовать терминал для touch соответствующего файла, чтобы принудительно переиндексировать его в Spotlight, а затем просмотрите еще раз.

В противном случае также может помочь убедиться, что вы удалили все посторонние копии своего приложения, а затем перестроили базу данных служб запуска (для этого вы можете использовать утилиту, которую я написал: Перестроить базу данных служб запуска.

В целом, ваша информация Info.plist в порядке, хотя я бы рекомендовал следующее:

  • В вашем UTExportedTypeDeclarations разделе UTTypeTagSpecification укажите OSType (код типа файла), только если вы действительно знаете, что делаете. Это означает, что вы, конечно, не используете тип, подобный 'appe' , который состоит из строчных букв, поскольку они зарезервированы для Apple. Я знаю, вы должны были зарегистрироваться создатель коды ( CFBundleSignature ы) с яблоком (я сделал несколько я), хотя я не уверен насчет типов файлов, и являются ли они до сих пор это делаю или нет. Если вы укажете некоторый код произвольного типа файла и не будете иметь представления о том, какие фактические коды использовались за последние 30 лет, вы рискуете вступить в конфликт с существующими определенными типами.

  • Измените тип UTI вашего документа, чтобы он более точно соответствовал вашему типу. Что-то вроде com.mycompany.appname.extension .

Затем измените CFBundleDocumentTypes запись в вашем документе, удалив CFBundleTypeExtensions запись и добавив LSItemContentTypes следующую:

 <key>CFBundleDocumentTypes</key>
<array>
    <dict>
        <key>LSItemContentTypes</key>
        <array>
              <string>com.mycompany.appname.extension</string>
        </array>
        <key>CFBundleTypeIconFile</key>
        <string>Icon</string>
        <key>CFBundleTypeName</key>
        <string>Custom Document</string>
        <key>CFBundleTypeRole</key>
        <string>Editor</string>
        <key>LSHandlerRank</key>
        <string>Default</string>
        <key>NSDocumentClass</key>
        <string>MyDocument</string>
    </dict>
</array>
  

Затем, наконец, проверьте, что какие-либо ключи в вашем Info.plist не переопределяются локализованными версиями в InfoPlist.strings файле, если они у вас есть.

Комментарии:

1. Большое вам спасибо! Сработало как по волшебству. В качестве примечания убедитесь, что эти UTI указаны в нижнем регистре.

2. Казалось, что это комбинация всех ваших шагов.