有没有办法,使用IOKit
或类似的东西,不涉及从互联网下载额外的包,我可以用来读取USB设备的产品名称?
这是我目前的代码......
func printSerialPaths(portIterator: io_iterator_t) {
var serialService: io_object_t
repeat {
serialService = IOIteratorNext(portIterator)
if (serialService != 0) {
var key: CFString! = "IOCalloutDevice"
var bsdPathAsCFtring: AnyObject? = IORegistryEntryCreateCFProperty(serialService, key, kCFAllocatorDefault, 0).takeUnretainedValue()
var bsdPath = bsdPathAsCFtring as! String?
if let path = bsdPath {
print(path)
}
var deviceNameCString: [CChar] = [CChar](count: 128, repeatedValue: 0)
let deviceNameResult = IORegistryEntryGetName(serialService, &deviceNameCString)
let deviceName = String.fromCString(&deviceNameCString)!
print("usb Device Name: \(deviceName)")
}
} while serialService != 0;
}
我也尝试过在IORegistryEntryCreateCFProperty()
命令中使用其他CFS字符串,例如"产品名称" ,因为我在其他地方看到过没有运气的建议。如果我只需要替换它,那么我在哪里可以找到其余字符串的文档?
我正在谈论的产品名称将在下面突出显示。我不确定它的技术名称是什么。
答案 0 :(得分:1)
如果io_service_t
句柄属于IOUSBDevice
/ IOUSBHostDevice
,则应该有一个名为"USB Product Name"
的属性(符号常量kUSBProductString
,至少在C中) - 我相信你所追求的是什么。您可以使用IORegistryEntryCreateCFProperty()
查询,因为您已经为" IOCalloutDevice"属性,顺便说一下定义为符号常量kIOCalloutDeviceKey
。
如果在导入IOKit模块时Swift中不存在这些常量,只需定义自己的常量并向Apple提交有关遗漏的错误(Radar)。