System Profiler如何检索完整的Mac硬件标识符?

时间:2011-11-08 22:47:47

标签: macos cocoa

有几个终端命令可以检索Mac硬件的数字/缩写模型标识符。

  • sysctl hw.model
  • system_profiler SPHardwareDataType

这些转储带有硬件名称和x,y版本控制的字符串。目前,我们必须维护一个表格,将这些标识符转换为完整的英文机器描述。

是否有API,或更好的命令行工具,可以生成更符合Apple的文档 MacBook Pro 15英寸,2009年中期而不是缩写 MacBookPro5的人性化名称,3 模型标识符?enter image description here

很简单,System Profiler如何获得Mac的全名,我可以通过脚本或程序系统地利用这些信息吗?

4 个答案:

答案 0 :(得分:13)

ServerKit.framework在其资源中有一个属性列表,可以帮助您使用模型标识符< - >型号名称字符串翻译:

/System/Library/PrivateFrameworks/ServerKit.framework/Versions/A/Resources/English.lproj/XSMachineAttributes.plist

答案 1 :(得分:13)

检查了网络流量。系统信息正在连接到

  

http://support-sp.apple.com

完整查询如下所示:

http://support-sp.apple.com/sp/product?cc=DJWR&lang=de_DE

其中'DJWR'是序列号的最后四个字符

此处有更多信息:http://blog.coriolis.ch/get-your-apple-device-model-name-in-a-readable-format/

答案 2 :(得分:5)

您可以使用system_profiler -xml SPHardwareDataType并查找machine_name密钥。

编辑:当然,这并没有回答System Profiler如何做到这一点的问题,但它提供了一种在自己的代码中完成它的方法。

答案 3 :(得分:3)

无需网络请求即可获取此信息。

“关于本机”中显示的当前型号可以从以下来源收集:

~/Library/Preferences/com.apple.SystemProfiler.plist

plist包含以当前用户添加的语言本地化的名称:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
    <key>GTF1-sv-SE_SE</key>
    <string>MacBook Pro (15 tum, 2016)</string>
    <key>GTF1-en-SE_SE</key>
    <string>MacBook Pro (15-inch, 2016)</string>
</dict>
</plist>

其中的键只是序列号(GTF1)的后4个字母,后跟区域设置。

如果愿意,您甚至可以编辑此plist来自定义“关于本机”窗口,这是Hackintosh用户中的常见做法。

编辑:

Swift 5中的完整实现:​​

public enum SystemInfo {

    public static var serialNumber: String? {
        let service = IOServiceGetMatchingService(kIOMasterPortDefault, IOServiceMatching("IOPlatformExpertDevice"))
        return IORegistryEntryCreateCFProperty(service, "IOPlatformSerialNumber" as CFString, kCFAllocatorDefault, 0).takeUnretainedValue() as? String
    }

    public static var modelName: String? {
        guard let serial = serialNumber,
            let plist = try? PropertyList.load(from: .init(fileURLWithPath: "\(NSHomeDirectory())/Library/Preferences/com.apple.SystemProfiler.plist")),
            let regionCode = Locale.current.regionCode,
            let names = plist["CPU Names"] as? [String: String],
            !names.isEmpty else {
                return nil
        }
        for language in Locale.preferredLanguages {
            let key = "\(serial.suffix(4))-\(language)_\(regionCode)"
            if let entry = names[key] {
                return entry
            }
        }
        return nil
    }

}

我还在使用此帮助程序枚举的地方:

public enum PropertyList {

    public static func load(from url: URL) throws -> [String: Any]? {
        guard let plist = FileManager.default.contents(atPath: url.path) else { return nil }
        var format = PropertyListSerialization.PropertyListFormat.xml
        return try PropertyListSerialization.propertyList(from: plist, options: .mutableContainersAndLeaves, format: &format) as? [String: Any]
    }

    public static func save(_ plist: [String: Any], to url: URL) throws {
        let data = try PropertyListSerialization.data(fromPropertyList: plist, format: .xml, options: 0)
        try data.write(to: url, options: .atomic)
    }

}

用法:

print(SystemInfo.modelName)

返回(瑞典语):

MacBook Pro (15 tum, 2016)