如何使用 Swift 和 AppKit(MacOS 的 Xcode)获取 IOBluetoothDevice 的电池电量 [英] How can I get IOBluetoothDevice's battery level, using Swift and AppKit (Xcode for MacOS)
问题描述
我正在使用 Xcode 开发基于 Cocoa 的 MacOS 应用 &AppKit,用 Swift 编写.
我在整个应用程序中使用
您可以使用 IOKit 从 IORegistry 获取蓝牙设备的电池电量.
这是获取 Magic Trackpad 2 电池电量的简单示例
导入IOKitvar serialPortIterator = io_iterator_t()变量对象:io_object_t让 masterPort: mach_port_t = kIOMasterPortDefault让匹配字典:CFDictionary = IOServiceMatching("AppleDeviceManagementHIDEventService")让 kernResult = IOServiceGetMatchingServices(masterPort, matchingDict, &serialPortIterator)如果 KERN_SUCCESS == kernResult {重复 {object = IOIteratorNext(serialPortIterator)如果对象 != 0,让百分比 = IORegistryEntryCreateCFProperty(object, "BatteryPercent" as CFString, kCFAllocatorDefault, 0).takeRetainedValue() as?整数{打印(百分比)休息}} 而对象!= 0IOObjectRelease(对象)}IOObjectRelease(serialPortIterator)
对于其他设备,您必须将 AppleDeviceManagementHIDEventService
和 Trackpad2
替换为适当的值.您可以使用 ioreg -l
在 Terminal.app 中显示整个 IORegistry.
I am using Xcode to develop a MacOS app, based on Cocoa & AppKit, written in Swift.
I am using IOBluetoothDevice objects throughout my app, and I want to be able to display the devices' battery levels, if accessible.
I expect that devices which battery levels are visible on the OS's Bluetooth settings (see image below), to be also accessible programmatically (e.g., AirPods, Magic Keyboard, etc.). However, I could not find this anywhere.
I have also thought about executing a terminal command and found this thread, but it did also not work.
Thanks
You can get the battery level of Bluetooth devices from the IORegistry with IOKit.
This is a simple example to get the battery level for the Magic Trackpad 2
import IOKit
var serialPortIterator = io_iterator_t()
var object : io_object_t
let masterPort: mach_port_t = kIOMasterPortDefault
let matchingDict : CFDictionary = IOServiceMatching("AppleDeviceManagementHIDEventService")
let kernResult = IOServiceGetMatchingServices(masterPort, matchingDict, &serialPortIterator)
if KERN_SUCCESS == kernResult {
repeat {
object = IOIteratorNext(serialPortIterator)
if object != 0, let percent = IORegistryEntryCreateCFProperty(object, "BatteryPercent" as CFString, kCFAllocatorDefault, 0).takeRetainedValue() as? Int {
print(percent)
break
}
} while object != 0
IOObjectRelease(object)
}
IOObjectRelease(serialPortIterator)
For other devices you have to replace AppleDeviceManagementHIDEventService
and Trackpad2
with the appropriate values. You can display the entire IORegistry in Terminal.app with ioreg -l
.
这篇关于如何使用 Swift 和 AppKit(MacOS 的 Xcode)获取 IOBluetoothDevice 的电池电量的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!