2013-03-16 44 views
3

如何查找Mac OSX序列號。查找Mac OSX序列號

有時需要獲取一個mac的序列號,然後您對此進行驗證。

幾年前,當我爲OsiriX開發插件時,我需要同樣的東西。我被要求以這種方式釋放它,只有少數系統可以使用該插件。

如果我們得到比這更好的解決方案,那對我們所有人都會有幫助。

回答

15

下面的代碼主要是從Technical Note TN1103, 複製與小的修改,以返回NSString,並使其與ARC編譯:

#include <IOKit/IOKitLib.h> 

- (NSString *)getSerialNumber 
{ 
    NSString *serial = nil; 
    io_service_t platformExpert = IOServiceGetMatchingService(kIOMasterPortDefault, 
            IOServiceMatching("IOPlatformExpertDevice")); 
    if (platformExpert) { 
     CFTypeRef serialNumberAsCFString = 
     IORegistryEntryCreateCFProperty(platformExpert, 
             CFSTR(kIOPlatformSerialNumberKey), 
             kCFAllocatorDefault, 0); 
     if (serialNumberAsCFString) { 
      serial = CFBridgingRelease(serialNumberAsCFString); 
     } 

     IOObjectRelease(platformExpert); 
    } 
    return serial; 
} 

你必須在IOKit.framework添加到您的構建設置。

+0

寫這個答案我做了一個SO搜索'kIOPlatformSerialNumberKey'這表明已經有含TN1103代碼很多答案之後。 – 2013-03-16 16:10:58

+0

是的,我知道:)我只想檢查我的方式是否好。如果你,Arpad和duskwuff說....我明白了我的觀點:) – 2013-03-16 16:27:25

+0

這對於作爲密碼一部分的註冊密鑰的加密也很有用。 – Volomike 2016-01-16 21:13:36

1

這是解決方案的斯威夫特版本:

var serialNumber: String? { 
    let platformExpert = IOServiceGetMatchingService(kIOMasterPortDefault, IOServiceMatching("IOPlatformExpertDevice")) 

    guard platformExpert > 0 else { 
    return nil 
    } 

    guard let serialNumber = (IORegistryEntryCreateCFProperty(platformExpert, kIOPlatformSerialNumberKey as CFString, kCFAllocatorDefault, 0).takeUnretainedValue() as? String) else { 
    return nil 
    } 


    IOObjectRelease(platformExpert) 

    return serialNumber 
}