在iOS上,检索当前设备的唯一和匿名的字符串是相当容易([[UIDevice currentDevice] uniqueIdentifier]
)。我在这里并不是指计算机的序列号,而是指由不同的组件特征/ sn组成的哈希,就像iOS udid一样。
Mac OS X上有类似的东西,以及如何访问它?
在iOS上,检索当前设备的唯一和匿名的字符串是相当容易([[UIDevice currentDevice] uniqueIdentifier]
)。我在这里并不是指计算机的序列号,而是指由不同的组件特征/ sn组成的哈希,就像iOS udid一样。
Mac OS X上有类似的东西,以及如何访问它?
#include <CoreFoundation/CoreFoundation.h>
#include <IOKit/IOKitLib.h>
// Returns the serial number as a CFString.
// It is the caller's responsibility to release the returned CFString when done with it.
void CopySerialNumber(CFStringRef *serialNumber)
{
if (serialNumber != NULL) {
*serialNumber = NULL;
io_service_t platformExpert = IOServiceGetMatchingService(kIOMasterPortDefault,
IOServiceMatching("IOPlatformExpertDevice"));
if (platformExpert) {
CFTypeRef serialNumberAsCFString =
IORegistryEntryCreateCFProperty(platformExpert,
CFSTR(kIOPlatformSerialNumberKey),
kCFAllocatorDefault, 0);
if (serialNumberAsCFString) {
*serialNumber = serialNumberAsCFString;
}
IOObjectRelease(platformExpert);
}
}
}
不要使用电脑的串口号 - 这只是初始工厂安装有效。如果您的主板在任何时候都被更换了,那么您将不再拥有序列号,因为它没有在出厂时设置为完整机器的一部分。
而应该使用硬件以太网ID,特别是设备'en0'。以下(非常相似)代码会给你:
//
// MACAddress.m
// XPPublisherCore
//
// Created by Jim Dovey on 11-01-30.
// Copyright 2011 XPlatform Inc. All rights reserved.
//
#import "MACAddress.h"
#import <IOKit/IOKitLib.h>
NSData * GetMACAddress(void)
{
kern_return_t kr = KERN_SUCCESS;
CFMutableDictionaryRef matching = NULL;
io_iterator_t iterator = IO_OBJECT_NULL;
io_object_t service = IO_OBJECT_NULL;
CFDataRef result = NULL;
matching = IOBSDNameMatching(kIOMasterPortDefault, 0, "en0");
if (matching == NULL)
{
fprintf(stderr, "IOBSDNameMatching() returned empty dictionary\n");
return (NULL);
}
kr = IOServiceGetMatchingServices(kIOMasterPortDefault, matching, &iterator);
if (kr != KERN_SUCCESS)
{
fprintf(stderr, "IOServiceGetMatchingServices() returned %d\n", kr);
return (NULL);
}
while ((service = IOIteratorNext(iterator)) != IO_OBJECT_NULL)
{
io_object_t parent = IO_OBJECT_NULL;
kr = IORegistryEntryGetParentEntry(service, kIOServicePlane, &parent);
if (kr == KERN_SUCCESS)
{
if (result != NULL)
CFRelease(result);
result = IORegistryEntryCreateCFProperty(parent, CFSTR("IOMACAddress"), kCFAllocatorDefault, 0);
IOObjectRelease(parent);
}
else
{
fprintf(stderr, "IORegistryGetParentEntry returned %d\n", kr);
}
IOObjectRelease(service);
}
return ((NSData *)NSMakeCollectable(result));
}
NSString * GetMACAddressDisplayString(void)
{
NSData * macData = GetMACAddress();
if ([macData length] == 0)
return (nil);
const UInt8 *bytes = [macData bytes];
NSMutableString * result = [NSMutableString string];
for (NSUInteger i = 0; i < [macData length]; i++)
{
if ([result length] != 0)
[result appendFormat: @":%02hhx", bytes[i]];
else
[result appendFormat: @"%02hhx", bytes[i]];
}
return ([[result copy] autorelease]);
}
为什么MAC地址不会改变,如果主板被更换? – sbooth
我更换了MacBook Pro主板,并更换了以太网MAC地址,但保留了序列号。 Wi-Fi MAC没有改变,因为它在一个单独的电路板上。 – user57368
MAC地址会改变,是的,但序列号可以完全消失。我曾经把这个系列作为一个UDID使用,但是很多大学经常联系我们说在一台机器修好之后,它的序列号被清除了,所以我们的软件被破坏了,因为我们没有UDID。然后我们转向MAC并且一切都很好 - 管理员对UDID的改变感到满意,只要软件仍然可以工作。 –