我使用Qt 5.3.2开发了一个Mac应用程序。此应用程序处理具有特定扩展名的文件(例如.xyz
)。
我创建了一个名为XYZ.icns的图标文件,并将其添加到我的应用包资源文件夹(MyApp.app/Contents/Resources/XYZ.icns
)。
我还修改了bundle的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
--------------------------------------------------------------------------------
...
EDIT2 :过了一段时间,它终于开始独立工作了。一夜之间,有一个操作系统更新已经安装,我也不得不关闭计算机(启动服务可能自己刷新了一些东西)。我会将我的问题更新为:如何确保启动服务在安装或修改应用程序时刷新关联的文件图标?
答案 0 :(得分:1)
我的理解是某些(内置)操作会触发Launch Services来刷新数据库。将新的.app包拖动到Applications文件夹是一个触发器,就像运行PackageMaker安装程序一样。但是,启动服务数据库中的内容与Finder显示的内容之间可能存在脱节(直到其他一些刷新/重新启动)。
一些快速Google搜索建议您可以从命令行强制重建:/System/Library/Frameworks/CoreServices.framework/Frameworks/LaunchServices.framework/Support/lsregister -kill -r -domain local -domain system -domain user
但是,由于内置触发器,此步骤不应该是必需的,因此除非您能够清楚地确定内置触发器为您的应用程序失败的原因,否则我会犹豫不决。如果问题是Finder的图标缓存,这可能也无济于事。