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