使用命令行中的ioreg
,很容易检测Mac是否有发光的键盘:
ioreg -c IOResources -d 3 | grep '"KeyboardBacklight" =' | sed 's/^.*= //g'
但是,我如何使用最新的Swift编程语言以编程方式获取此 IOKit
布尔属性呢?我正在寻找一些示例代码。
我通过一些试错,得出了以下结论:
我在MacBook Air(带键盘背光)和iMac(没有键盘背光)上进行了测试,在两种情况下都产生了正确的结果。
import Foundation
import IOKit
func keyboardHasBacklight() -> Bool {
let port: mach_port_t
if #available(macOS 12.0, *) {
port = kIOMainPortDefault // New name as of macOS 12
} else {
port = kIOMasterPortDefault // Old name up to macOS 11
}
let service = IOServiceGetMatchingService(port, IOServiceMatching(kIOResourcesClass))
guard service != IO_OBJECT_NULL else {
// Could not read IO registry node. You have to decide whether
// to treat this as a fatal error or not.
return false
}
guard let cfProp = IORegistryEntryCreateCFProperty(service, "KeyboardBacklight" as CFString,
kCFAllocatorDefault, 0)?.takeRetainedValue(),
let hasBacklight = cfProp as? Bool
else {
// "KeyboardBacklight" property not present, or not a boolean.
// This happens on Macs without keyboard backlight.
return false
}
// Successfully read boolean "KeyboardBacklight" property:
return hasBacklight
}
IOServiceMatching
和 IOServiceGetMatchingServices
?由于我需要 macOS 12 或更高版本,所以我将使用最新的 kIOMainPortDefault
而不是旧的 kIOMasterPortDefault
。谢谢! - TzarIOServiceGetMatchingService(..., IOServiceMatching("IOResources"))
也可以工作。 IORegistryEntryFromPath(...)
是我设法运行的第一个版本。 我怀疑没有功能上的区别,所以选择你自己喜欢的 :) - 我仍然在macOS 11.6上,因此我没有注意到已重命名的属性。 当然,您可以使用kIOMainPortDefault。 - Martin R使用Swift调用I/O Kit有一定的挑战性。在这里,您有两种策略:
- 您可以将I/O Kit API包装在Swift友好的封装器中,然后使用该封装器来完成您的任务。
- 您可以直接执行任务,导致大量丑陋的低级Swift代码。