在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的改變感到滿意,只要軟件仍然可以工作。 –