有人知道(在文件系统中)找到每个具有给定捆绑包标识符的应用程序的好方法吗?NSWorkspace
和LaunchServices允许您按捆绑包标识符查找应用程序,但只返回一个结果。我怀疑Spotlight(NSMetadataQuery
)可能会有所帮助,但我对其API有点不清楚,所以我不确定是否有合适的密钥。
有命令行lsregister
工具(在LaunchServices.framework中),可以告诉它(重新)注册系统上的所有内容,然后转储它所知道的所有内容的报告。依赖它似乎不太理想,因为它没有文档,解析它的输出可能会很痛苦。
(背景:我正在构建一个用于游戏修改的应用程序,并希望提供用户界面,以便从支持的游戏的短列表中快速选择,而不是要求用户在开放面板中浏览整个文件系统。然而,我预计用户很可能安装了一个游戏的多个副本:发行版和测试版,用于修改的额外副本等。)
您需要kMDItemCFBundleIdentifier
聚光灯/元数据密钥。
pierre$39> mdfind "kMDItemCFBundleIdentifier == 'org.videolan.vlc'"
/Applications/VLC.app
/Applications/vlc-0.8.6c/VLC.app
从那里开始,只需要对文件元数据API进行正确的调用(选择毒药、Carbon或Cocoa)。有趣的是,这个键并没有得到很好的记录:它不在文件元数据属性引用中,尽管它在MDItem引用中。
再一次,这表明游戏改装工具会引发其他类型应用程序很少出现的用例,而苹果有时也不会很好地提供这些用例…<皂盒>
附录:一旦你有了你的列表,在我看来,向用户展示它的最佳方式是列出你找到的每个项目的版本(kMDItemVersion
);您也可以显示路径,但版本可能对用户最有用(毕竟,他可能会保留不同的实例以获得特定的版本)。
这个问题是在2012年提出的,涉及OS X Lion 10.7。从OS X Yosemite 10.10开始,答案是:
LSCopyApplicationURLsForBundleIdentifier
摘要:
给定一个bundle标识符(如com.apple.finder),查找相应应用程序的所有URL。
讨论:
向具有指定捆绑包标识符的应用程序返回零个或多个URL。
另一种选择是使用LSCopyApplicationURLsForURL来查找处理特定URL方案的所有应用程序的所有副本。然而,这确实需要应用程序定义URL方案。
例如,你可以找到所有处理"mailto"方案的电子邮件应用程序,即使系统上有同一应用程序的多个版本。
这是我所知道的获取所有应用程序的唯一方法,而不是系统认为的其他调用返回的"默认"或"首选"应用程序。