Связь с Mac OS X работает, но значок файла не изменился
Я разработал приложение для Mac, используя Qt 5.3.2. Это приложение обрабатывает файлы с определенным расширением (скажем, .xyz
).
Я создал файл значков с именем XYZ.icns и добавил его в папку ресурсов пакета приложений (MyApp.app/Contents/Resources/XYZ.icns
).
Я также изменил файл Info.plist пакета для установки ассоциации файлов. Я добавил эту запись:
<key>CFBundleDocumentTypes</key>
<array>
<!-- Registered file accociation -->
<dict>
<key>CFBundleTypeRole</key>
<string>Editor</string>
<key>CFBundleTypeName</key>
<string>XYZ</string>
<key>CFBundleTypeExtensions</key>
<array>
<string>xyz</string>
</array>
<key>CFBundleTypeIconFile</key>
<string>XYZ</string>
</dict>
<array>
Результат: сработало сопоставление файлов (двойной щелчок по файлу открывает мое приложение), однако значок не был заменен (по-прежнему отображается значок пустого документа).
Есть что-то, что я пропустил? Я посмотрел на другие приложения для примеров, и, кажется, нет ничего больше, чем я сделал.
РЕДАКТИРОВАТЬ: я сделал еще несколько тестов. Я сбросил данные службы запуска с помощью этой команды:
/System/Library/Frameworks/CoreServices.framework/Frameworks/LaunchServices.framework/Versions/Current/Support/lsregister -dump
В результате я могу найти претензии к файлу типа файла, включая информацию о значке:
...
--------------------------------------------------------------------------------
Container mount state: mounted
bundle id: 105396
...
path: /Applications/MyApp.app
name: MyApp
...
--------------------------------------------------------
claim id: 27628
name: XYZ
rank: Default
reqCaps:
roles: Editor
flags: relative-icon-path doc-type
icon: Contents/Resources/XYZ.icns
bindings: .xyz
--------------------------------------------------------------------------------
...
РЕДАКТИРОВАТЬ 2: Через некоторое время он, наконец, начал работать самостоятельно. Ночью, есть обновление ОС, которое было установлено, и я также должен был выключить компьютер (Служба запуска, вероятно, обновила что-то самостоятельно). Я хотел бы обновить свой вопрос следующим образом: как убедиться, что служба запуска обновляет значки соответствующих файлов, когда приложение установлено или изменено?
1 ответ
Насколько я понимаю, определенные (встроенные) действия запускают Launch Services для обновления базы данных. Перетаскивание нового пакета.app в папки "Приложения" является одним из триггеров, как и запуск установщика PackageMaker. Однако может быть разрыв между тем, что находится в базе данных Launch Services и тем, что показывает Finder (до некоторого другого обновления / перезапуска).
Некоторые быстрые поиски в Google показывают, что вы можете принудительно пересобрать из командной строки: /System/Library/Frameworks/CoreServices.framework/Frameworks/LaunchServices.framework/Support/lsregister -kill -r -domain local -domain system -domain user
Однако этот шаг не должен быть необходим из-за встроенных триггеров, поэтому я не буду его использовать, если вы не сможете четко определить, почему встроенные триггеры не работают в вашем приложении. И если проблема в кеше иконок Finder, это тоже может не помочь.