Macos 如何查找具有相同捆绑包标识符的多个应用程序?

Macos 如何查找具有相同捆绑包标识符的多个应用程序?,macos,cocoa,launch-services,Macos,Cocoa,Launch Services,有没有人知道一种好方法,可以找到(在文件系统中)每个具有给定捆绑包标识符的应用程序NSWorkspace和Launch Services允许您按包标识符查找应用程序,但只返回一个结果。我怀疑Spotlight(NSMetadataQuery)可能会有所帮助,但我对它的API有点不清楚,所以我不确定是否有合适的密钥 有一个命令行lsregister工具(在LaunchServices.framework内部),可以告诉它(重新)注册系统上的所有内容,然后转储一个关于它所知道的所有内容的报告。依赖它

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

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


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

您需要
kMDItemCFBundleIdentifier
Spotlight/metadata键

pierre$39>mdfind“kMDItemCFBundleIdentifier=='org.videolan.vlc'”
/应用程序/VLC.app
/应用程序/vlc-0.8.6c/vlc.app
从那以后,你只需要正确的选择(选择你的毒药、碳或可可粉)。有趣的是,这把钥匙没有很好的记录:它不在,尽管它在

这再一次表明,游戏修改工具提高了用例,而其他类型的应用程序很少提高用例,而且


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

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

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


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

这个问题是在2012年关于OS X Lion 10.7提出的。截至OS X Yosemite 10.10,答案是:

总结:

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

讨论:

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


更有效的一点是,
lsregister
可以被告知(重新)注册一件事,然后转储一份关于它所知道的一切的报告。您提到了启动服务,但您一定错过了中的LSCopyApplicationURLsForBundleIdentifier()。“启动服务允许您按包标识符查找应用程序,但只返回一个结果”-你指的是哪种功能?请看我的回答:@ChrisPage:事实上,在10.7的时间框架内,我肯定没有看到苹果会在以后推出我需要的三个OS X版本的功能。OIC:你在2012年问过这个问题,它是在OS X 10.10(2014)中引入的.堆栈交换Q&a可以有如此长的生命周期,因此很容易不知道一个问题(或答案)有多老是的。另外,OS X发布的速度比以前快了。如果人们在问题中加入OS版本,这会有所帮助。不过,我想知道:你在问题中提到的功能是什么?这非常有效,谢谢!不过我看到了一个奇怪的问题:当我搜索“com.blizzard.WarcraftIII”时使用
mdfind
,它工作得很好,但是当我使用
NSMetadataQuery
时,结果有一个
kMDItemDisplayName
的值,但没有
kMDItemPath
(或者
kMDItemVersion
),其他bundle ID工作得很好(至少是我尝试过的那些;我的应用程序可以与暴雪游戏一起使用,而WoW和SC2是我可以方便地测试的其他应用程序)。我怀疑这是一个bug…@rickster你确定你至少不能获得路径吗?(我有War3,但这台机器上没有Xcode,所以我无法检查。)事实上,War3似乎没有可用的版本,即使它是一个bug,你也必须做一些事情,因此如果你能得到路径或URL(这个项目必须在某个地方!),您可以应用特定于War3的处理来获取感兴趣的信息,例如,从info.plist获取非标准暴雪文件版本密钥。顺便说一句,您是一个能够反射获取显示名称的专家。是的,没有路径。显然
NSMetadataQuery
找到了应用程序并拥有路径;否则它将无法告诉我名称……但是结果缺少
kMDItemPath
键(以及其他一些键)。此外,任何查询都会发现该应用程序(即按名称搜索不会得到路径)。非常奇怪。我会做一些调查,看看是否有其他应用程序捆绑包出现此问题,并可能在此处询问其他问题和/或提交错误。@rickster OK,显然是kMDItemPath的奇怪之处之一(它既不能用于查询,也不能用于对结果进行排序)事实上,即使它没有列在属性数组中,您仍然可以调用属性的
值:(NSString*)kMDItemPath
,并获得答案(确保包括CoreServices.h并添加CoreServices框架)。请将此作为一个问题,以便我可以给您一个正确的答案。请注意,如果用户碰巧关闭了聚光灯,则此操作将失败。这对于您使用的应用程序非常有效