很容易檢測 Mac 是否ioreg在命令列上有一個發光的鍵盤......
ioreg -c IOResources -d 3 | grep '"KeyboardBacklight" =' | sed 's/^.*= //g'
…但是我怎樣才能IOKit使用最新的 Swift 以編程方式獲得這個布爾屬性?我正在尋找一些示例代碼。
uj5u.com熱心網友回復:
我通過一些試驗和錯誤找出了以下內容:
- 從 IO 注冊表中獲取“IOResources”節點。
- 從該節點獲取“KeyboardBacklight”屬性。
- (有條件地)將屬性值轉換為布林值。
我已經在 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
}
uj5u.com熱心網友回復:
為了完整起見,我想在Martin 的出色回答中添加一些內容。以下是我從 Apple 的開發人員技術支持那里得到的注釋:
從 Swift 呼叫 I/O Kit 有點挑戰。您在這里有兩種策略:
- 您可以將 I/O Kit API 包裝在一個 Swift 友好的包裝器中,然后使用它來完成您的任務。
- 您可以直接執行您的任務,從而導致許多丑陋的低級 Swift。
從 I/O 注冊表中提取隨機屬性并不是實作長期二進制兼容性的最佳途徑。我們這里的一般策略是我們只支持在標頭中定義了符號常量的屬性(最值得注意的是
IOKitKeys.h,但還有很多其他的)。KeyboardBacklight沒有符號常量,因此不受支持。
確保您進行防御性編碼。此屬性可能會消失、更改含義、更改其型別等。您的代碼在所有這些場景中都必須表現得合理。
請確保您提交了對適當 API的增強請求以獲取此資訊,并確保包含對您的總體目標的高級描述。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/382404.html
