如何使用 Swift 和 AppKit(MacOS 的 Xcode)获取 IOBluetoothDevice 的电池电量 [英] How can I get IOBluetoothDevice's battery level, using Swift and AppKit (Xcode for MacOS)

查看:61
本文介绍了如何使用 Swift 和 AppKit(MacOS 的 Xcode)获取 IOBluetoothDevice 的电池电量的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我正在使用 Xcode 开发基于 CocoaMacOS 应用 &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, &ser​​ialPortIterator)如果 KERN_SUCCESS == kernResult {重复 {object = IOIteratorNext(serialPortIterator)如果对象 != 0,让百分比 = IORegistryEntryCreateCFProperty(object, "BatteryPercent" as CFString, kCFAllocatorDefault, 0).takeRetainedValue() as?整数{打印(百分比)休息}} 而对象!= 0IOObjectRelease(对象)}IOObjectRelease(serialPortIterator)

对于其他设备,您必须将 AppleDeviceManagementHIDEventServiceTrackpad2 替换为适当的值.您可以使用 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屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆