Come posso ottenere l'icona di un dispositivo di archiviazione in Mac OS X?

StackOverflow https://stackoverflow.com/questions/580002

  •  06-09-2019
  •  | 
  •  

Domanda

Non ho trovato i miei dispositivi che utilizzano IOServiceGetMatchingServices e ottenuto il dizionario proprietà come questa:

kernResult = IORegistryEntryCreateCFProperties(nextMedia,
                    (CFMutableDictionaryRef *)&props,
                                              kCFAllocatorDefault, 0);

Da quel dizionario posso estrarre le informazioni per le icone:

NSString *bId = [props valueForKeyPath:@"IOMediaIcon.CFBundleIdentifier"];
NSString *rFile = [props valueForKeyPath:@"IOMediaIcon.IOBundleResourceFile"];

Quei due mi danno questo (come esempio):

com.apple.iokit.IOStorageFamily   (Bundle identifier)
Internal.icns                     (Resource File)

Ho cercato di estrarre l'icona usando questo metodo:

NSBundle *bundleWithIcon = [NSBundle bundleWithIdentifier:bId];
NSString *iconPath = [bundleWithIcon pathForResource:rFile ofType:nil];

Ma bundleWithIcon è nil.

E 'questo anche il metodo corretto per ottenere l'icona?

Credo di avere in qualche modo per caricare il fascio di essere in grado di caricarlo con bundleWithIdentifier, come posso fare questo?

PS: C'è un'altra domanda che (credo) prova a chiedere la stessa cosa, ma chiede solo per pacchetti, se questo non è il modo corretto.

È stato utile?

Soluzione 2

Andrew Myrick ha risposto ad una domanda simile da Darwin-dev mailing list:

  

KextManagerCreateURLForBundleIdentifier()   in <IOKit/kext/KextManager.h> può essere   di utilizzo, anche se credo che funziona solo   per kexts che sono o 1) di caricamento,   o 2) in / S / L / E /. Ecco la neve   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);
     

Si noti che prima di Snow Leopard, è   può funzionare solo per kexts a / S / L / E; il   API esisteva, ma non c'era   headerdoc descrivere il suo comportamento.

Per me questo ha funzionato molto bene su Mac OS X 10.5.

Altri suggerimenti

Si potrebbe utilizzare NSWorkspace.
L'immagine iniziale è 32x32, ma ha rappresentazioni per le altre dimensioni e scalerà di conseguenza

NSWorkspace * ws = [NSWorkspace sharedWorkspace];
NSImage * icon = [ws iconForFile:@"/Volumes/Whatever"];
NSLog(@"%@", [icon representations]); // see what sizes the icon has
icon.size = NSMakeSize(512, 512);

questo può aiutare. (O forse no) ...

a giocare con il comando 'ioreg' mi sono imbattuto in qualcosa che mi ricordava la tua domanda, e così ho post-it:

provare il seguente comando:

ioreg -c IOMedia -x

, che produrrà un gran casino di uscita che sembra qualcosa di simile:

  |     +-o IOBlockStorageDriver  <class IOBlockStorageDriver, registered, matched, active, busy 0, retain 7>
  |       +-o Apple read/write Media  <class IOMedia, registered, matched, active, busy 0, retain 9>
  |         | {
  |         |   "Removable" = Yes
  |         |   "BSD Unit" = 0x4
  |         |   "IOBusyInterest" = "IOCommand is not serializable"
  |         |   "BSD Minor" = 0xc
  |         |   "Ejectable" = Yes
  |   |         |   "BSD Name" = "disk4"
  |         |   "Leaf" = No
  |         |   "IOMediaIcon" = {"CFBundleIdentifier"="com.apple.iokit.IOStorageFamily","IOBundleResourceFile"="Removable.icns"}
  |         |   "Preferred Block Size" = 0x200
  |         |   "Whole" = Yes
  |         |   "Open" = Yes
  |         |   "Size" = 0x100000
  |         |   "Writable" = Yes
  |         |   "Content" = "Apple_partition_scheme"
  |         |   "IOGeneralInterest" = "IOCommand is not serializable"
  |         |   "Content Hint" = ""
  |         | }         |   "BSD Major" = 0xe

tutto questo mi porta a credere (e quindi qui ciecamente consigliamo di indagare) che se si attraversa l'albero corrispondente registro io contro 'Iomedia' è possibile ottenere dizionari di proprietà che conterrà una voce digitato "IOMediaIcon", che appare in sé essere una collezione che informa di un identificatore fagotto e un nome di file di risorse.

non vuol dire che questo è facile ... ma guardare il FireWire SDK per tutto il codice di esempio potrebbe essere necessario ... in ogni caso è probabilmente "migliore" di percorsi preriempite duri di codifica (che potrebbe scomparire nelle future release del sistema operativo).

| K <

  

Quei due mi danno questo (come esempio):

     

com.apple.iokit.IOStorageFamily (identificatore bundle)     Internal.icns (File di risorse)

     

Ho cercato di estrarre l'icona usando questo metodo:

     

* NSBundle bundleWithIcon = [NSBundle bundleWithIdentifier: BID];     NSString * IconPath = [bundleWithIcon pathForResource: RFILE OfType: nil];

     

Ma bundleWithIcon è nil.

bundleWithIdentifier: richiede di avere già creata un'istanza NSBundle per un bundle con tale identificatore; sembra solo un esempio creato in precedenza. Pertanto, è necessario trovare il pacchetto nel file system e un'istanza dal percorso. Per fortuna, ti sembra di avere già il link al dubbio su questo.

Un volume senza un'icona personalizzata sta per essere visualizzato con una delle icone generiche del sistema operativo che hai hard-coded percorsi da qui. Un volume con un'icona personalizzata sta per memorizzare l'icona sul suo file system, e se non è montato, trovando diventa del tutto il vostro lavoro.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top