Расположение пакетов по идентификатору - PullRequest
6 голосов
/ 13 октября 2008

Я хочу создать пакет из произвольного идентификатора пакета
например com.apple.iokit.IOStorageFamily

Это не лишено смысла, поскольку предполагается, что идентификаторы комплекта
быть уникальным, однако очевидный код не работает:

NSString* bID = @"com.apple.iokit.IOStorageFamily";
NSBundle* bundle = [NSBundle bundleWithIdentifier:bID];

Этот код работает только для уже загруженных пакетов
(привет, проблема с курицей и яйцом), и на самом деле у вас есть
узнать немного больше об идентификаторе
прежде чем вы сможете сделать что-нибудь. Для вышеуказанного стиля ID
Я выделяю последний компонент и преобразую его в
/System/Library/Extensions/IOStorageFamily.kext
который я тогда загружаю путем.

Это уровень техники или есть более общий путь?

Ответы [ 6 ]

9 голосов
/ 13 октября 2008

Используйте это

NSString *path = [[NSWorkspace sharedWorkspace] absolutePathForAppBundleWithIdentifier:@"com.apple.TextEdit"];
4 голосов
/ 04 ноября 2008

Я не думаю, что Mac OS X хранит глобальную базу данных всех идентификаторов пакетов.

Как уже отмечалось, вы можете найти приложение довольно простым способом с NSWorkspace.

Кроме того, так как вы использовали kext для своего примера, в Leopard (10.5) есть инструмент под названием "kextfind", который вы можете запустить для поиска кекстов в системной папке Exensions (кексы в других местах не найдены, если Вы указываете инструмент на эти другие места). У kextfind есть много опций - подробности см. на странице руководства, но чтобы найти kext по идентификатору пакета, вы можете сделать это:

kextfind -bundle-id com.apple.iokit.IOStorageFamily

В настоящее время у нас нет API уровня C для поиска кекс-программ по идентификатору пакета.

Что касается взлома пути от последнего компонента идентификатора пакета: не делайте этого. Нет ничего, что требовало бы, чтобы имя оболочки совпадало с последним компонентом идентификатора пакета, и я видел kexts (не говоря уже о других пакетах), где эти два не совпадают.

3 голосов
/ 18 октября 2009

Совсем недавно Эндрю Майрик ответил на аналогичный вопрос в списке рассылки darwin-dev:

KextManagerCreateURLForBundleIdentifier() в <IOKit/kext/KextManager.h> может быть использования, хотя я считаю, что это работает только для кексов, которые либо 1) загружены, или 2) в / S / L / E /. Вот снег Leopard headerdoc:

/*!
 * @function KextManagerCreateURLForBundleIdentifier
 * @abstract Create a URL locating a kext with a given bundle identifier.
 *
 * @param    allocator
 *           The allocator to use to allocate memory for the new object.
 *           Pass <code>NULL</code> or <code>kCFAllocatorDefault</code>
 *           to use the current default allocator.
 * @param    kextIdentifier
 *           The bundle identifier to look up.
 *
 * @result
 * A CFURLRef locating a kext with the requested bundle identifier.
 * Returns <code>NULL</code> if the kext cannot be found, or on error.
 *
 * @discussion
 * Kexts are looked up first by whether they are loaded, second by version.
 * Specifically, if <code>kextIdentifier</code> identifies a kext
 * that is currently loaded,
 * the returned URL will locate that kext if it's still present on disk.
 * If the requested kext is not loaded,
 * or if its bundle is not at the location it was originally loaded from,
 * the returned URL will locate the latest version of the desired kext,
 * if one can be found within the system extensions folder.
 * If no version of the kext can be found, <code>NULL</code> is returned.
 */
CFURLRef KextManagerCreateURLForBundleIdentifier(
    CFAllocatorRef allocator,
    CFStringRef    kextIdentifier);

Обратите внимание, что до снежного барса это может работать только для kexts в / S / L / E; API существовал, но не было headerdoc, описывающий его поведение.

Для меня это очень хорошо работало на Mac OS X 10.5.

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

Для полноты я должен упомянуть, что вы можете искать все пакеты (не только KEXT) с данным идентификатором пакета, используя kMDItemCFBundleIdentifier Spotlight / ключ метаданных; конечно, вы должны быть готовы обрабатывать более одного (обычно они должны иметь разные версии).

0 голосов
/ 04 ноября 2008

Чтобы ответить на этот вопрос, я думаю, что на самом деле нужно знать: «Почему вы ищете идентификаторы пакета таким образом?» Если всегда есть кексы, которые вы можете искать в некоторых довольно разумных местах, если это приложения, которые вы можете использовать LS, я не вижу случая, когда вы захотите сделать оба, поэтому я не вижу необходимости иметь Распространенный способ сделать это.

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

0 голосов
/ 14 октября 2008

Если то, что вы ищете, определенно является kext, то вы можете посмотреть информационный словарь для каждого пакета в папке / S / L / Es /, пока не найдете свой. Там нет поиска пакетов по идентификатору, кроме как для Приложений (где LaunchServices это сделает) и загруженных пакетов, как вы уже нашли.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...