如何使用 Swift 和 AppKit(Xcode for MacOS)获取 IOBluetoothDevice 的电池电量
How can I get IOBluetoothDevice's battery level, using Swift and AppKit (Xcode for MacOS)
我正在使用Xcode开发MacOS应用程序,基于Cocoa & AppKit,写在Swift.
我在整个应用程序中使用 IOBluetoothDevice 对象,并且我希望能够显示设备的电池电量(如果可以访问)。
我希望在 OS 的蓝牙设置(见下图)中可以看到电池电量的设备也可以通过编程方式访问(例如,AirPods、妙控键盘等)。但是,我在任何地方都找不到这个。
我也想过执行终端命令并找到this thread,但它也没有用。
谢谢
您可以使用 IOKit 从 IORegistry 获取蓝牙设备的电池电量。
这是获取妙控板 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)
对于其他设备,您必须将 AppleDeviceManagementHIDEventService
和 Trackpad2
替换为适当的值。您可以使用 ioreg -l
.
在 Terminal.app 中显示整个 IORegistry
我正在使用Xcode开发MacOS应用程序,基于Cocoa & AppKit,写在Swift.
我在整个应用程序中使用 IOBluetoothDevice 对象,并且我希望能够显示设备的电池电量(如果可以访问)。
我希望在 OS 的蓝牙设置(见下图)中可以看到电池电量的设备也可以通过编程方式访问(例如,AirPods、妙控键盘等)。但是,我在任何地方都找不到这个。
我也想过执行终端命令并找到this thread,但它也没有用。
谢谢
您可以使用 IOKit 从 IORegistry 获取蓝牙设备的电池电量。
这是获取妙控板 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)
对于其他设备,您必须将 AppleDeviceManagementHIDEventService
和 Trackpad2
替换为适当的值。您可以使用 ioreg -l
.