2012-06-20 13 views
7

Ich möchte mein Mac-System eindeutig über Code identifizieren. Ich finde die Hardware UUID in meinem About this Mac. So wie programmgesteuert auf die eindeutige UUID von MAc OS X zugreifen.So identifizieren Sie ein Mac-System eindeutig

Bitte geben Sie mir, wenn es alternative Vorschläge für mein Problem gibt.

Antwort

3

Von hier aus: https://stackoverflow.com/a/2754563/610351

void get_platform_uuid(char * buf, int bufSize) { 
    io_registry_entry_t ioRegistryRoot = IORegistryEntryFromPath(kIOMasterPortDefault, "IOService:/"); 
    CFStringRef uuidCf = (CFStringRef) IORegistryEntryCreateCFProperty(ioRegistryRoot, CFSTR(kIOPlatformUUIDKey), kCFAllocatorDefault, 0); 
    IOObjectRelease(ioRegistryRoot); 
    CFStringGetCString(uuidCf, buf, bufSize, kCFStringEncodingMacRoman); 
    CFRelease(uuidCf);  
} 

Sie können den CFStringGetCString mit einer einfachen Umstellung auf NSString * ersetzen.

18

Also, wenn Sie über die neuen Regeln App Store etc do not care ... hier geht:

- (NSString *)getSystemUUID { 
    io_service_t platformExpert = IOServiceGetMatchingService(kIOMasterPortDefault,IOServiceMatching("IOPlatformExpertDevice")); 
    if (!platformExpert) 
     return nil; 

    CFTypeRef serialNumberAsCFString = IORegistryEntryCreateCFProperty(platformExpert,CFSTR(kIOPlatformUUIDKey),kCFAllocatorDefault, 0); 
    IOObjectRelease(platformExpert); 
    if (!serialNumberAsCFString) 
     return nil; 

    return (__bridge NSString *)(serialNumberAsCFString);; 
} 

Bitte beachten Sie:

  • Sie müssen hinzufügen IOKit.framework zu Ihrem Projekt, damit dieses funktioniert.
  • Dieser Code ist ARC-kompatibel;
  • Dieser Code ist sicher und es wird ein nilNSString zurückgegeben, wenn etwas schief geht;
  • Apple garantiert nicht, dass alle zukünftigen Systeme über eine Software-lesbare Seriennummer verfügen.
  • Entwickler sollten keine Annahmen über das Format der Seriennummer machen, wie zum Beispiel die Länge oder welche Zeichen es enthalten darf.
+0

Sollte 'IOObjectRelease (platformExpert);' auch im '! SerialNumberAsCFString'-Block aufgerufen werden? Wenn man nur den Code liest, scheint dies notwendig zu sein. –

+0

@DjS ja du hast einen guten Punkt. Ich habe einen Schnitt gemacht, um das zu beheben. – TCB13

+1

Was ist, wenn uns die neuen AppStore-Regeln wichtig sind? – tofutim