【发布时间】:2012-06-20 06:10:38
【问题描述】:
我想通过代码唯一标识我的 mac 系统。我在关于这台 Mac 中找到了硬件 UUID。 那么如何以编程方式从 MAC OS X 访问唯一的 uuid。
如果对我的问题有任何替代建议,请提供给我。
【问题讨论】:
标签: objective-c macos hardware-id
我想通过代码唯一标识我的 mac 系统。我在关于这台 Mac 中找到了硬件 UUID。 那么如何以编程方式从 MAC OS X 访问唯一的 uuid。
如果对我的问题有任何替代建议,请提供给我。
【问题讨论】:
标签: objective-c macos hardware-id
所以,如果你不关心新的 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 添加到您的项目中才能执行此操作
去工作。 nil NSString;【讨论】:
!serialNumberAsCFString 块内也调用IOObjectRelease(platformExpert);?只通读代码,这似乎是必要的。
__bridge 需要是__bridge_transfer。正如所写,字符串会泄漏。
从这里: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* 的简单转换。
【讨论】: