在iPhone上我可以使用
[[UIDevice currentDevice] uniqueIdentifier];
获取标识此设备的字符串。 OSX中有什么相同的东西吗?我没找到任何东西。我只想确定启动该应用程序的Mac。你能救我吗?
答案 0 :(得分:30)
Apple有technote唯一识别mac的方法。这是Apple在该技术说明中发布的代码的松散修改版本...不要忘记将您的项目与IOKit.framework
链接以构建此代码:
#import <IOKit/IOKitLib.h>
- (NSString *)serialNumber
{
io_service_t platformExpert = IOServiceGetMatchingService(kIOMasterPortDefault,
IOServiceMatching("IOPlatformExpertDevice"));
CFStringRef serialNumberAsCFString = NULL;
if (platformExpert) {
serialNumberAsCFString = IORegistryEntryCreateCFProperty(platformExpert,
CFSTR(kIOPlatformSerialNumberKey),
kCFAllocatorDefault, 0);
IOObjectRelease(platformExpert);
}
NSString *serialNumberAsNSString = nil;
if (serialNumberAsCFString) {
serialNumberAsNSString = [NSString stringWithString:(NSString *)serialNumberAsCFString];
CFRelease(serialNumberAsCFString);
}
return serialNumberAsNSString;
}
答案 1 :(得分:17)
Swift 2回答
这个答案增加了Jarret Hardie 2011年的答案。这是一个Swift 2 String扩展。我已经添加了内联注释来解释我做了什么以及为什么,因为导航是否需要释放对象在这里可能会很棘手。
extension String {
static func macSerialNumber() -> String {
// Get the platform expert
let platformExpert: io_service_t = IOServiceGetMatchingService(kIOMasterPortDefault, IOServiceMatching("IOPlatformExpertDevice"));
// Get the serial number as a CFString ( actually as Unmanaged<AnyObject>! )
let serialNumberAsCFString = IORegistryEntryCreateCFProperty(platformExpert, kIOPlatformSerialNumberKey, kCFAllocatorDefault, 0);
// Release the platform expert (we're responsible)
IOObjectRelease(platformExpert);
// Take the unretained value of the unmanaged-any-object
// (so we're not responsible for releasing it)
// and pass it back as a String or, if it fails, an empty string
return (serialNumberAsCFString.takeUnretainedValue() as? String) ?? ""
}
}
或者,该函数可以返回String?
,最后一行可以不返回空字符串。这可能会更容易识别无法检索序列号的极端情况(例如在他对Jerret的回答的评论中提到的修复的Mac主板情景哈里斯)。
我还用仪器验证了正确的内存管理。
我希望有人觉得它很有用!
答案 2 :(得分:1)
感谢。改变后完美运作
serialNumberAsNSString = [NSString stringWithString:(NSString *)serialNumberAsCFString];
要
serialNumberAsNSString = [NSString stringWithString:(__bridge NSString *)serialNumberAsCFString];
Xcode本身推荐使用__bridge。