9

我想通过代码唯一地识别我的 mac 系统。我在关于这台 Mac 中找到了硬件 UUID。那么如何以编程方式从 MAC OS X 访问唯一的 uuid。

如果对我的问题有任何替代建议,请提供给我。

4

2 回答 2

21

所以,如果你不关心新的 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;
  • 这段代码是安全的,nil NSString如果出现问题它会返回一个;
  • Apple 不保证所有未来的系统都将具有软件可读的序列号。
  • 开发人员不应对序列号的格式做出任何假设,例如序列号的长度或可能包含的字符。
于 2013-06-25T16:41:48.417 回答
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);    
}

您可以将 CFStringGetCString 替换为对 NSString* 的简单转换。

于 2012-06-20T06:43:16.247 回答