OS X: расположение пакета по идентификатору для вновь установленного приложения - PullRequest
4 голосов
/ 14 июня 2009

Вопрос похож на Поиск пакетов по идентификатору , но другая проблема:

У меня есть несколько приложений, которым нужно найти пакеты друг друга по их идентификатору. Это всегда работает хорошо, если я не делаю полностью новую установку всех своих приложений. Во многих случаях достаточно указать искатель на место установки, чтобы местоположения пакета были известны, но иногда даже этого недостаточно; Я должен запустить приложение, прежде чем его идентификатор пакета можно будет использовать, чтобы найти путь. Следует отметить, что я использую установщик, который копирует приложения в / Applications /, поэтому средство поиска никогда не открывается при установке приложений.

Похоже, что при новой установке пакета приложения системе требуется некоторое время, прежде чем обновляется какой-либо внутренний реестр, который сопоставляет идентификатор пакета с местоположением пакета. То, что я хотел бы знать, это:

  1. где хранятся эти сопоставления и
  2. как заставить систему / файловый менеджер / рабочее пространство (?) Обновить карту

Ответы [ 2 ]

3 голосов
/ 08 апреля 2012

Альтернативой, в случае необходимости, будет поиск с использованием API Spotlight с ключом kMDItemCFBundleIdentifier:

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

Spotlight тесно интегрирован с системой, так что файлы / папки индексируются, как только они записываются в файловую систему, у вас не должно возникнуть проблем с тем, что приложение еще не проиндексировано. Конечно, вы должны быть готовы обработать более одного ответа ...

2 голосов
/ 14 июня 2009

Отображения сохраняются в базе данных Launch Services. Я не знаю, где это хранится, но точное местоположение не имеет значения, так как есть лучшие способы достижения вашей цели.

Вы можете вручную обновить базу данных Launch Services несколькими способами, но лично я думаю, что сделать это программно будет проще, особенно в вашей ситуации. В этом случае вы бы использовали API Launch Services - в частности, я бы рассмотрел использование LSRegisterURL(), поскольку это, похоже, позволяет достичь того, что вы хотите.

Ознакомьтесь с документацией Launch Services для получения дополнительной информации о регистрации приложений в базе данных и о том, как все это работает в целом.

...