7

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

有命令行lsregister工具(在 LaunchServices.framework 中),可以告诉它(重新)注册系统上的所有内容,然后转储它所知道的所有内容的报告。依赖它似乎不太理想,因为它没有记录并且解析它的输出可能会很痛苦。

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

4

3 回答 3

8

您需要kMDItemCFBundleIdentifierSpotlight/元数据键。

pierre$39> mdfind "kMDItemCFBundleIdentifier == 'org.videolan.vlc'"
/Applications/VLC.app
/Applications/vlc-0.8.6c/VLC.app

从那里开始,应该只是对文件元数据 API进行正确调用(选择你的毒药、Carbon 或 Cocoa)。有趣的是,这个键并没有很好地记录:它不在File Metadata Attributes Reference中,尽管它在MDItem Reference中。

再一次,它表明游戏修改工具提出了很少有其他类型的应用程序提出的用例,而且苹果有时不能很好地服务……</soapbox>

附录:一旦你有了你的清单,我认为向用户展示它的最佳方式是列出kMDItemVersion你找到的每个项目的版本 ( );您可能还会显示路径,但版本可能对用户最有用(毕竟,他可能会保留不同的实例以获取特定版本)。

于 2012-04-08T14:52:08.147 回答
4

这个问题是在 2012 年就 OS X Lion 10.7 提出的。从 OS X Yosemite 10.10 开始,答案是:

LSCopyApplicationURLsForBundleIdentifier

概括:

给定一个包标识符(例如 com.apple.finder),找到对应应用程序的所有 URL。

讨论:

将零个或多个 URL 返回到具有指定捆绑标识符的应用程序。

于 2016-05-11T04:31:14.687 回答
1

另一种选择是使用 LSCopyApplicationURLsForURL 来查找处理特定 URL 方案的所有应用程序的所有副本。但是,这确实需要应用程序定义 URL 方案。

例如,您可以找到所有处理“mailto”方案的电子邮件应用程序,即使系统上有同一个应用程序的多个版本。

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

于 2014-03-19T02:12:27.227 回答