代码之家  ›  专栏  ›  技术社区  ›  Anoop Vaidya

查找Mac OSX序列号

  •  6
  • Anoop Vaidya  · 技术社区  · 12 年前

    如何查找Mac OSX序列号。

    有时需要获取mac的序列号,然后在上面进行验证。

    几年前,当我为 OsiriX 。我被要求以这样的方式发布它,只有少数系统可以使用该插件。

    如果我们能得到比这更好的解决方案,那对我们所有人都会很有帮助。

    3 回复  |  直到 7 年前
        1
  •  19
  •   Anoop Vaidya    11 年前

    以下代码主要复制自 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添加到您的构建设置中。

        2
  •  9
  •   leogdion gbdavid    8 年前

    这是Swift版本的解决方案:

    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
    }
    
        3
  •  3
  •   davidj    6 年前

    这是一个基于Martin上面提到的TN1103的C++版本。

    C++示例:

    #include <CoreFoundation/CoreFoundation.h>
    #include <IOKit/IOKitLib.h>
    
    std::string example_class::getSerialNumber()
    {
        CFStringRef serial;
        char buffer[64] = {0};
        std::string seriaNumber("");
        io_service_t platformExpert = IOServiceGetMatchingService(kIOMasterPortDefault,
                                                              IOServiceMatching("IOPlatformExpertDevice"));
        if (platformExpert)
        {
            CFTypeRef serialNumberAsCFString = IORegistryEntryCreateCFProperty(platformExpert,
                                                                           CFSTR(kIOPlatformSerialNumberKey),
                                                                           kCFAllocatorDefault, 0);
            if (serialNumberAsCFString) {
                serial = (CFStringRef)serialNumberAsCFString;
            }
            if (CFStringGetCString(serial, buffer, 64, kCFStringEncodingUTF8)) {
                seriaNumber = buffer;
            }
    
            IOObjectRelease(platformExpert);
        }
        return seriaNumber;
    }