有没有人知道找到(在文件系统中)具有给定包标识符的每个应用程序的好方法? NSWorkspace
和启动服务允许您按包标识符查找应用程序,但只返回单个结果。我怀疑Spotlight(NSMetadataQuery
)可能有所帮助,但我对它的API有点不清楚,所以我不确定是否有合适的密钥。
有命令行lsregister
工具(在LaunchServices.framework内部),可以告诉他(重新)注册系统上的所有内容,然后将报告转发给它知道的所有内容。依赖于它似乎不太理想,因为它没有文档,解析它的输出可能是一种痛苦。
(背景:我正在构建一个用于游戏修改的应用程序,并希望提供用于从支持的游戏的简短列表中快速选择的UI,而不是要求用户在打开的面板中挖掘整个文件系统。但是,我期望用户很可能安装了多个游戏副本:发行版和测试版,修改版的额外副本等。)
答案 0 :(得分:7)
您需要kMDItemCFBundleIdentifier
Spotlight /元数据密钥。
pierre$39> mdfind "kMDItemCFBundleIdentifier == 'org.videolan.vlc'"
/Applications/VLC.app
/Applications/vlc-0.8.6c/VLC.app
从那里开始,只需要对file metadata APIs进行正确的调用(选择你的毒药,碳或可可)。有趣的是,这个密钥没有很好地记录:它不在File Metadata Attributes Reference中,尽管它在MDItem Reference中。
再一次,它表明游戏模型工具会引发其他类型的应用程序引发的用例,that sometimes aren't very well served by Apple ...< / soapbox>
附录:一旦你有了你的清单,在我看来,向用户展示它的最佳方式是列出你找到的每个项目的版本(kMDItemVersion
);你也可能会显示路径,但版本对用户来说可能是最有用的东西(毕竟,为了拥有特定的版本,他可能会保留不同的实例)。
答案 1 :(得分:4)
2012年有人问OS X Lion 10.7这个问题。从OS X Yosemite 10.10开始,答案是:
LSCopyApplicationURLsForBundleIdentifier
要点:
给定一个包标识符(例如com.apple.finder),找到相应应用程序的所有URL。
讨论:
向具有指定包标识符的应用程序返回零个或多个URL。
答案 2 :(得分:1)
另一种方法是使用LSCopyApplicationURLsForURL查找处理特定URL方案的所有应用程序的所有副本。这确实需要应用程序定义URL方案。
例如,您可以找到处理“mailto”方案的所有电子邮件应用程序,即使系统上有同一个应用程序的多个版本。
这是我知道获取所有应用程序的唯一方式,而不是系统认为其他调用返回的“默认”或“首选”应用程序。