2012-06-20 64 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