#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. Казалось, что это комбинация всех ваших шагов.