2012-06-20 5 views
7

Desidero identificare il mio sistema mac in modo univoco tramite codice. Trovo l'UUID Hardware nel mio Informazioni su questo Mac. Quindi, come accedere a livello di programmazione l'uuid unico da MAc OS X.Come identificare un sistema Mac in modo univoco

Gentilmente fornirmi se ci sono suggerimenti alternativi per il mio problema.

risposta

3

Da qui: 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);  
} 

è possibile sostituire il CFStringGetCString con una semplice conversione a NSString *.

18

Quindi, se non si preoccupano le nuove regole AppStore, ecc ... qui si va:

- (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);; 
} 

Attenzione: per

  • è necessario aggiungere al vostro IOKit.framework progetto in modo che questo funzioni.
  • Questo codice è conforme ARC;
  • Questo codice è sicuro e restituirà un nilNSString se qualcosa va storto;
  • Apple non garantisce che tutti i sistemi futuri dispongano di un numero di serie leggibile da software.
  • Gli sviluppatori non devono formulare alcuna ipotesi sul formato del numero di serie come la sua lunghezza o quali caratteri può contenere .
+0

"IOObjectRelease (platformExpert);" può anche essere chiamato all'interno del blocco '! SerialNumberAsCFString'? Leggendo solo il codice, questo sembra necessario. –

+0

@DjS sì, hai un buon punto. Ho fatto una modifica per risolvere questo problema. – TCB13

+1

Cosa succede se ci preoccupiamo delle nuove regole di AppStore? – tofutim