Frage

Ich habe meine Geräte mit IOServiceGetMatchingServices gefunden und bekam die Eigenschaft Wörterbuch wie folgt aus:

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

Von diesem Wörterbuch kann ich die Informationen für die Symbole extrahieren:

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

Die beiden geben Sie mir dies (als Beispiel):

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

Ich habe versucht, das Symbol mit dieser Methode zu extrahieren:

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

Aber bundleWithIcon ist nil.

Ist das auch die richtige Methode auf das Symbol zu bekommen?

Ich glaube, ich habe irgendwie das Bündel laden kann, um es zu laden, mit bundleWithIdentifier, wie kann ich das tun?

PS: Es ist eine andere Frage dem (glaube ich), die gleiche Sache zu stellen versucht, aber nur fragt nach Bündel, nicht, ob dies ist der richtige Weg.

War es hilfreich?

Lösung 2

Erst vor kurzem Andrew Myrick beantwortet eine ähnliche Frage auf der Mailingliste darwin-dev:

  

KextManagerCreateURLForBundleIdentifier()   kann in <IOKit/kext/KextManager.h> sein   Zu, obwohl ich es nur glauben funktioniert   für kexts, die entweder 1) geladen sind,   oder 2) in / S / L / E /. Hier ist der Schnee   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);
     

Beachten Sie, dass vor dem Snow Leopard, es   dürfen nur für kexts in / S / L / E arbeiten; das   API existiert, aber es gab keine   headerdoc beschreibt sein Verhalten.

Für mich funktionierte wirklich gut auf Mac OS X 10.5.

Andere Tipps

Sie könnten NSWorkspace verwenden.
Das Anfangsbild ist 32x32, aber es hat Darstellungen für die anderen Größen und skaliert entsprechend

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

Dies kann Ihnen helfen. (Oder auch nicht) ...

mit der ‚ioreg‘ Befehl spielen um stieß ich auf etwas, das mich auf Ihre Frage erinnert, und so werde ich es schreiben:

versuchen, den folgenden Befehl eingeben:

ioreg -c IOMedia -x

, die ein großes Durcheinander von Ausgang ergeben, die etwa wie folgt aussieht:

  |     +-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

Dies führt mich glauben (und damit hier blind empfehlen, dass Sie untersuchen), dass, wenn Sie die io Registrierungsstruktur Abgleich mit ‚iomedia‘ durchqueren können Sie Eigenschaft Wörterbücher erhalten, die einen Eintrag eingegeben enthalten wird „IOMediaIcon“, die selbst erscheint eine Sammlung informieren Sie aus einer Bündel-Kennung und einen Ressourcendateinamen zu sein.

nicht sagen, dass dies einfach ... aber schauen Sie in die FireWire SDK für den all Beispiel-Code können Sie brauchen ... in jedem Fall ist es wahrscheinlich „besser“ als Hartcodierung vorgefüllten Bahnen (die in Zukunft OS Versionen verschwinden könnten).

| K <

  

Die beiden geben Sie mir dies (als Beispiel):

     

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

     

Ich habe versucht, das Symbol mit dieser Methode zu extrahieren:

     

NSBundle * bundleWithIcon = [NSBundle bundleWithIdentifier: BID];     NSString * IconPath = [bundleWithIcon pathForResource: RDATEI ofType: nil];

     

Aber bundleWithIcon ist nil.

bundleWithIdentifier: erfordert, dass Sie bereits haben eine NSBundle Instanz mit dieser Kennung für ein Bündel erstellt; es sieht nur eine zuvor erstellte Instanz auf. Daher müssen Sie das Paket in dem Datei-System zu finden und durch Pfadnamen instanziiert. Glücklicherweise scheinen Sie schon, dass der Link auf die Frage haben.

Ein Volumen ohne eigenes Symbol wird mit einem der generischen Symbolen OS angezeigt werden, die Sie haben Wege hartcodiert hier. Ein Volumen mit einem benutzerdefinierten Symbol wird das Symbol speichern auf dem Dateisystem, und wenn es nicht angebracht ist, findet es ganz Ihre Aufgabe wird.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top