【发布时间】:2015-09-03 15:30:05
【问题描述】:
受这个问题的启发:
Is there a way of getting a Mac's icon given its model number?
我正在努力获得类似的结果,但使用 Mac 的型号标识符作为开始,而不是 Mac 的型号。
但是当我使用我的 Mac 的型号标识符来查找相关的系统图标时,我遇到了一个奇怪的问题。
在我的办公机器上,我得到 "iMac14,2" 作为型号标识符。
当我将此 plist 作为字典加载时...
/System/Library/PrivateFrameworks/ServerInformation.framework/Versions/A/Resources/English.lproj/SIMachineAttributes.plist
...我看到它有适用于所有 Mac 型号的键,包括“iMac14,2”,其中的值包含图标的 URL。
但是,当我尝试为标识符键 ("iMac14,2") 获取此字典的值时,我得到了 nil,尽管如果我使用文字键获取实际值。
但是文字键和我从modelIdentifier 函数获得的键是相同的。反正看起来是这样的……
获取模型标识符:
func modelIdentifier() -> String? {
let service: io_service_t = IOServiceGetMatchingService(kIOMasterPortDefault, IOServiceMatching("IOPlatformExpertDevice").takeUnretainedValue())
let cfstr = "model" as CFString
if let model = IORegistryEntryCreateCFProperty(service, cfstr, kCFAllocatorDefault, 0).takeUnretainedValue() as? NSData {
if let nsstr = NSString(data: model, encoding: NSUTF8StringEncoding) {
return String(nsstr)
}
}
return nil
}
if let id = modelIdentifier() {
println(id) // prints "iMac14,2"
}
使用此结果查找值失败:
if let dict = NSDictionary(contentsOfFile: "/System/Library/PrivateFrameworks/ServerInformation.framework/Versions/A/Resources/English.lproj/SIMachineAttributes.plist") as? [String:AnyObject] {
if let id = modelIdentifier() {
if let result = dict[id] as? [String:AnyObject] {
print(result) // nil
}
}
}
但如果我对文字字符串做同样的事情:
if let result = dict["iMac14,2"] as? [String:AnyObject] {
print(result)
}
result:
[架构:x86_64,本地化:{ description = "iMac with 27\" 宽屏 LED 背光显示屏,2013 年底推出。"; MarketingModel = "27\" iMac (Late 2013)"; 型号 = iMac; 处理器=“四核英特尔酷睿i5,四核英特尔酷睿i7”; },hardwareImageName:/System/Library/CoreServices/CoreTypes.bundle/Contents/Resources/com.apple.imac-unibody-27-no-optical.icns]
这里有什么问题?
字符串看起来一样但不一样?
还是我错过了什么?
【问题讨论】: