有几个终端命令可以检索Mac硬件的数字/缩写模型标识符。
sysctl hw.model
system_profiler SPHardwareDataType
这些转储带有硬件名称和x,y版本控制的字符串。目前,我们必须维护一个表格,将这些标识符转换为完整的英文机器描述。
是否有API,或更好的命令行工具,可以生成更符合Apple的文档 MacBook Pro 15英寸,2009年中期而不是缩写 MacBookPro5的人性化名称,3 模型标识符?
很简单,System Profiler如何获得Mac的全名,我可以通过脚本或程序系统地利用这些信息吗?
答案 0 :(得分:13)
ServerKit.framework
在其资源中有一个属性列表,可以帮助您使用模型标识符< - >型号名称字符串翻译:
/System/Library/PrivateFrameworks/ServerKit.framework/Versions/A/Resources/English.lproj/XSMachineAttributes.plist
答案 1 :(得分:13)
检查了网络流量。系统信息正在连接到
完整查询如下所示:
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)