Как найти несколько приложений с одинаковым идентификатором пакета? - PullRequest
6 голосов
/ 12 января 2012

Кто-нибудь знает хороший способ найти (в файловой системе) каждое приложение с заданным идентификатором пакета?NSWorkspace и Launch Services позволяют искать приложение по идентификатору пакета, но возвращают только один результат.Я подозреваю, что Spotlight (NSMetadataQuery) может помочь, но я немного не уверен в его API, поэтому я не уверен, есть ли подходящий ключ.

Имеется инструмент командной строки lsregister (внутри LaunchServices.framework), который можно попросить (пере) зарегистрировать все в системе и затем вывести отчет обо всем, что он знает.Полагаться на это кажется далеко не идеальным, так как он недокументирован, и его вывод может быть проблематичным.

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

Ответы [ 3 ]

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

Требуется ключ kMDItemCFBundleIdentifier Прожектор / метаданные.

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

Оттуда нужно просто сделать правильные вызовы к API метаданных файла (выберите яд, углерод или какао). Интересно, что этот ключ не очень хорошо задокументирован: его нет в справочнике атрибутов метаданных файла , хотя он находится в справочнике MDItem .

Еще раз, это говорит о том, что инструменты моддинга игры поднимают случаи использования, которые поднимают несколько других видов приложений, и , которые иногда не очень хорошо обслуживаются Apple

Приложение: как только вы получите свой список, по моему мнению, лучший способ представить его пользователю - это перечислить версию (kMDItemVersion) каждого найденного вами элемента; Вы также можете указать путь, но версия, вероятно, будет наиболее полезной для пользователя (в конце концов, он, вероятно, хранит разные экземпляры, чтобы иметь конкретные версии).

4 голосов
/ 11 мая 2016

Этот вопрос был задан в 2012 году относительно OS X Lion 10.7.Начиная с OS X Yosemite 10.10 ответ таков:

LSCopyApplicationURLsForBundleIdentifier

Сводка:

Дан идентификатор пакета (такой как com.apple.finder), найдите все URL-адреса соответствующего приложения.

Обсуждение:

Возвращает ноль или более URL-адресов для приложений, имеющих указанный идентификатор пакета.

1 голос
/ 19 марта 2014

Другой альтернативой является использование LSCopyApplicationURLsForURL для поиска всех копий всех приложений, которые обрабатывают определенную схему URL. Однако для этого требуется, чтобы приложение определило схему URL.

Например, вы можете найти все почтовые приложения, которые обрабатывают схему 'mailto', даже если в системе несколько версий одного и того же приложения.

Это единственный известный мне способ получения всех приложений вместо того, что система считает приложением «по умолчанию» или «предпочтительным», возвращаемым с другими вызовами.

...