如何找到具有相同捆绑标识符的多个应用?

时间:2012-01-12 19:24:07

标签: macos cocoa launch-services

有没有人知道找到(在文件系统中)具有给定包标识符的每个应用程序的好方法? NSWorkspace和启动服务允许您按包标识符查找应用程序,但只返回单个结果。我怀疑Spotlight(NSMetadataQuery)可能有所帮助,但我对它的API有点不清楚,所以我不确定是否有合适的密钥。

有命令行lsregister工具(在LaunchServices.framework内部),可以告诉他(重新)注册系统上的所有内容,然后将报告转发给它知道的所有内容。依赖于它似乎不太理想,因为它没有文档,解析它的输出可能是一种痛苦。

(背景:我正在构建一个用于游戏修改的应用程序,并希望提供用于从支持的游戏的简短列表中快速选择的UI,而不是要求用户在打开的面板中挖掘整个文件系统。但是,我期望用户很可能安装了多个游戏副本:发行版和测试版,修改版的额外副本等。)

3 个答案:

答案 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”方案的所有电子邮件应用程序,即使系统上有同一个应用程序的多个版本。

这是我知道获取所有应用程序的唯一方式,而不是系统认为其他调用返回的“默认”或“首选”应用程序。