首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >系统剖析器如何检索完整的Mac硬件标识符?

系统剖析器如何检索完整的Mac硬件标识符?
EN

Stack Overflow用户
提问于 2011-11-08 22:47:46
回答 4查看 10.7K关注 0票数 24

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

  • sysctl hw.model
  • system_profiler SPHardwareDataType

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

是否有一个API,或者更好的命令行工具,可以生成更人性化的名称,与苹果的文档MacBookPro5,3 MacBook Pro 15英寸、Mid 2009或MacBook Pro (13英寸,2016,4 Thunderbol3端口)相匹配,而不是更简略的或MacBookPro13,2模型标识符?

总之,systematically是如何获得Macintosh硬件的全本地化名称的,我可以通过脚本或程序生成这些信息来系统地使用这些信息?

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2019-09-06 11:18:09

不需要网络请求来获取这一信息。

当前的模型,如在这个Mac中所显示的,可以从以下几个方面收集:

代码语言:javascript
复制
~/Library/Preferences/com.apple.SystemProfiler.plist

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

代码语言:javascript
复制
<?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来定制你关于这个Mac窗口的信息,这是黑客用户的一种常见做法。

编辑:

在Swift 5中全面实施:

代码语言:javascript
复制
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
    }

}

在这里,我还使用了这个助手枚举:

代码语言:javascript
复制
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)
    }

}

用法:

代码语言:javascript
复制
print(SystemInfo.modelName)

返回(瑞典语):

代码语言:javascript
复制
MacBook Pro (15 tum, 2016)
票数 7
EN

Stack Overflow用户

发布于 2011-11-22 03:41:31

查过网络流量了。系统信息连接到

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/

票数 16
EN

Stack Overflow用户

发布于 2011-11-16 01:16:36

ServerKit.framework的资源中有一个属性列表,可以帮助您处理模型标识符<->模型名称字符串转换:

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

票数 13
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/8058151

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档