2011-08-15 45 views
4

可能重复:
Unique Identifier of a Mac?UDID相当于在Mac

在iOS上,检索当前设备的唯一和匿名的字符串是相当容易([[UIDevice currentDevice] uniqueIdentifier])。我在这里并不是指计算机的序列号,而是指由不同的组件特征/ sn组成的哈希,就像iOS udid一样。

Mac OS X上有类似的东西,以及如何访问它?

回答

2

Tech Note 1103

#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); 
     } 
    } 
} 
1

不要使用电脑的串口号 - 这只是初始工厂安装有效。如果您的主板在任何时候都被更换了,那么您将不再拥有序列号,因为它没有在出厂时设置为完整机器的一部分。

而应该使用硬件以太网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]); 
} 
+0

为什么MAC地址不会改变,如果主板被更换? – sbooth

+0

我更换了MacBook Pro主板,并更换了以太网MAC地址,但保留了序列号。 Wi-Fi MAC没有改变,因为它在一个单独的电路板上。 – user57368

+0

MAC地址会改变,是的,但序列号可以完全消失。我曾经把这个系列作为一个UDID使用,但是很多大学经常联系我们说在一台机器修好之后,它的序列号被清除了,所以我们的软件被破坏了,因为我们没有UDID。然后我们转向MAC并且一切都很好 - 管理员对UDID的改变感到满意,只要软件仍然可以工作。 –