2012-06-20 92 views
7

我想通過代碼唯一識別我的mac系統。我在「關於此Mac」中找到硬件UUID。 因此,如何以編程方式訪問MAc OS X中的唯一uuid。如何識別唯一的Mac系統

如果對我的問題有任何其他建議,請提供給我。

回答

3

從這裏: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);  
} 

你可以用一個簡單的轉換來的NSString更換CFStringGetCString *。

18

所以,如果你不關心新的AppStore規則等..在這裏你去:

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

請注意:

  • 您需要添加IOKit.framework到您的項目爲了這個 工作。
  • 此代碼符合ARC標準;
  • 此代碼是安全的,如果出現問題,它將返回nilNSString;
  • Apple不保證所有將來的系統都具有軟件可讀的序列號。
  • 開發人員不應對序列號的格式(如長度或其可能包含的字符)做出任何假設。
+0

''IOObjectRelease(platformExpert);'也可以在'!serialNumberAsCFString'塊中調用嗎?只讀代碼,這似乎是必要的。 –

+0

@DJS是的,你有一個好點。我做了一個修改來解決這個問題。 – TCB13

+1

如果我們關心新的AppStore規則會怎樣? – tofutim