5

类似于Locating bundles by identifier的问题,但不同的问题:

我有几个应用程序需要通过它们的 ID 来定位彼此的包。除非我对所有应用程序进行全新安装,否则它总是很有效。在许多情况下,将查找器指向安装位置就足以知道捆绑包的位置,但有时甚至这还不够;我必须先运行应用程序,然后才能使用它的捆绑 ID 来查找路径。我应该提到我正在使用将应用程序复制到 /Applications/ 的安装程序,因此当我安装应用程序时查找器永远不会打开。

似乎当新安装应用程序包时,系统需要一些时间才能更新将包 ID 映射到包位置的某些内部注册表。我想知道的是:

  1. 这些映射在哪里维护?
  2. 如何强制系统/文件管理器/工作区(?)更新地图
4

2 回答 2

3

An alternative, in case you ever need one, would be to search using the Spotlight APIs with the kMDItemCFBundleIdentifier key:

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

Spotlight is tightly integrated with the system, such that files/folders get indexed as soon as they are written to the filesystem, you should not have any issue of the app not having been indexed yet. Of course, you have to be ready to handle more than one response…</p>

于 2012-04-08T16:37:24.123 回答
3

映射在 Launch Services 数据库中维护。我不知道它的存储位置,但确切的位置无关紧要,因为有更好的方法可以实现您的目标。

您可以通过多种方式手动更新 Launch Services 数据库,但就个人而言,我认为以编程方式进行会更容易,尤其是在您的情况下。在这种情况下,您将使用 Launch Services API — 具体来说,我会考虑使用LSRegisterURL(),因为这似乎可以实现您想要做的事情。

查看Launch Services 文档,了解有关在数据库中注册应用程序以及这一切通常如何工作的更多信息。

于 2009-06-14T19:30:40.387 回答