受这个问题的启发:
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
:
[architecture:x86_64, LOCALIZABLE :{ description =“iMac with 27”宽屏LED背光显示屏,于2013年底推出。“; marketingModel =“27”iMac(2013年末)“; model = iMac; processor =“四核英特尔酷睿i5,四核英特尔酷睿i7”; },hardwareImageName:/System/Library/CoreServices/CoreTypes.bundle/Contents/Resources/com.apple.imac-unibody-27-no-optical.icns]
这里有什么问题?
字符串看起来相同但不一样?
或者我错过了其他什么?
答案 0 :(得分:3)
NSData
为IORegistryEntryCreateCFProperty
键创建的model
包含一个以NUL结尾的字符串。您将NUL包含在NSString
。
改为以这种方式创建字符串:
if let nsstr = NSString(CString: UnsafePointer<Int8>(model.bytes), encoding: NSUTF8StringEncoding) {
return String(nsstr)
}