york solomon psicologia new michael kotler consumidor compra comportamiento capitulo cocoa osx

cocoa - solomon - Localización de paquetes por identificador



psicologia del consumidor pdf (6)

Quiero crear un paquete a partir de un identificador de paquete arbitrario
por ejemplo, com.apple.iokit.IOStorageFamily

No es una cosa irracional hacer ya que se suponen ID de paquete
para ser único, sin embargo, el código obvio no funciona:

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

Este código solo funciona para los paquetes que ya ha cargado
(Hola, pollo y huevo problema), y de hecho, tienes
saber un poco más de lo que te gustaría sobre el identificador
antes de que puedas hacer algo Para el estilo de ID anterior
Agrupe el componente final y lo transformo en
/System/Library/Extensions/IOStorageFamily.kext
que luego cargo por ruta.

¿Es este el estado del arte o hay una forma más general?


Si lo que estás buscando es definitivamente un kext, entonces podrías mirar el diccionario de información de cada paquete en la carpeta / S / L / Es / hasta que encuentres el tuyo. No hay búsqueda de paquete por identificador aparte de para Aplicaciones (donde LaunchServices lo hará), y paquetes cargados como ya ha encontrado.


Utilizar esta

NSString *path = [[NSWorkspace sharedWorkspace] absolutePathForAppBundleWithIdentifier:@"com.apple.TextEdit"];


No creo que Mac OS X mantenga una base de datos global de todos los ID de paquete en todas partes.

Como se señaló, puede encontrar una aplicación de una manera bastante sencilla con NSWorkspace.

Además, dado que usaste un kext para tu ejemplo, en Leopard (10.5) hay una herramienta llamada "kextfind" que puedes ejecutar para buscar kexts en el sistema. Carpeta de Exenciones (los kexts en otros lugares no se encontrarán a menos que señales el herramienta en esos otros lugares). kextfind tiene muchas opciones, mira la página man para más detalles, pero para encontrar un kext por ID, puedes hacerlo:

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

Actualmente no tenemos una API de nivel C para buscar kexts por ID de paquete.

En cuanto a piratear el camino desde el último componente de la identificación del paquete: no hagas eso. No hay nada que requiera que el nombre de la envoltura coincida con el último componente de la ID del paquete, y he visto kexts (para no hablar de otros paquetes), donde los dos no coinciden.


Para responder a esta pregunta, creo que uno realmente necesita saber "¿Por qué está buscando identificadores de paquetes de esta manera?" Si siempre hay kexts puedes buscar en algunos lugares bastante razonables, si son aplicaciones puedes usar LS, no veo un caso en el cual quieras hacer ambas cosas, así que no veo la necesidad de tener un forma común de hacerlo

Se debe tener en cuenta que puede tener varias instancias de identificadores de paquetes idénticos en un Volumen.


Recientemente, Andrew Myrick respondió una pregunta similar en la lista de correo de darwin-dev:

KextManagerCreateURLForBundleIdentifier() en <IOKit/kext/KextManager.h> puede ser de utilidad, aunque creo que solo funciona para kexts que están 1) cargados, o 2) en / S / L / E /. Aquí está el encabezado Snow Leopard:

/*! * @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);

Tenga en cuenta que, antes de Snow Leopard, solo puede funcionar para kexts en / S / L / E; la API existía, pero no había un encabezado describiendo su comportamiento.

Para mí, esto funcionó muy bien en Mac OS X 10.5.


Para completar, debo mencionar que puede buscar todos los paquetes (no solo KEXT) con un identificador de paquete dado utilizando la kMDItemCFBundleIdentifier Spotlight / metadata; por supuesto, debes estar preparado para manejar el hecho de que haya más de uno (normalmente deberían tener versiones diferentes).