在命令行中,很容易检测到Mac是否有带有ioreg的照明键盘:
ioreg -c IOResources -d 3 | grep '"KeyboardBacklight" =' | sed 's/^.*= //g'但是,如何使用最新的Swift以编程方式获得这个IOKit布尔属性?我在找一些样本代码。
发布于 2021-12-15 10:51:26
我通过一些尝试和错误找出了以下几点:
我已经在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
}发布于 2021-12-16 07:15:07
作为马丁的绝妙回答的增编,以下是我从苹果开发人员技术支持处得到的说明:
从Swift调用I/O Kit有点困难。这里有两种策略:
从I/O注册表中提取随机属性并不是实现长期二进制兼容性的最佳途径。我们的一般策略是,我们只支持在标头中定义符号常量的属性(最显著的是
IOKitKeys.h,但还有很多其他属性)。KeyboardBacklight没有符号常量,因此不受支持。确保你是防御性的代码。该属性可能会消失,更改含义,更改其类型,等等。在所有这种情况下,您的代码必须表现得合理。
请确保您提交了一个适当的API获得这一信息的增强请求,确保包括一个高层次的描述,你的总体目标。
https://stackoverflow.com/questions/70360160
复制相似问题