自从我将 macOS 更新到 macOS 12 以来,我每次在使用 CoreBluetooth 时都会遇到问题。
在我的一个应用程序中,我将使用以下命令列出所有 BLE 设备CGCentralManager
class.
这已经有效多年了。但现在,当我启动应用程序时,Xcode 中会出现以下输出:
[CoreBluetooth] No name or address
[CoreBluetooth] No name or address
[CoreBluetooth] No name or address
[CoreBluetooth] No name or address
[CoreBluetooth] No name or address
macOS控制台应用程序有很多这样的消息(我不知道这是否相关,该过程是bluetoothd而不是我的应用程序):
Destroying pairing agent for session <appname>
Erasing session 0x7f795824af00 from SessionMap for "appname-2890-84"
Received 'stop scan' request from session "com.apple.bluetoothd-central-143-2" updateScanParams:YES shouldUpdateState:YES
Stopping scan as there are no remaining scan agents permitted to scan
如果我的应用程序没有运行,蓝牙进程似乎相当安静。一旦启动,蓝牙进程似乎有某种问题。问题是:哪一个?
禁用沙箱并没有改变任何东西,所以我不认为它与缺少权限有关。
我还在一个新应用程序中构建了一个非常基本的示例。我实例化了一个新的 CBCentralManager 并开始扫描。这些设备被发现了。
我的主应用程序没有触发委托功能。一个都没有。
有人遇到同样的问题吗?
更新:Apple 似乎已经修复了 macOS 12.3 中的错误。
下面的原始答案适用于 12.0、12.1 和 12.2。
Apple 似乎已经更新了 macOS,使其表现得更像 iOS。这scanForPeripheralsWithServices 的文档:选项: https://developer.apple.com/documentation/corebluetooth/cbcentralmanager/1518986-scanforperipheralswithservices?language=objc say:
您的应用程序可以通过指定bluetooth-central后台模式在后台扫描蓝牙设备。为此,您的应用必须通过在 serviceUUIDs 参数中指定来显式扫描一项或多项服务。在后台扫描时,CBCentralManager 扫描选项无效。
命令行程序永远不能被视为前台应用程序,因为它们不是 .app,因此适用后台扫描规则。 (这是推测,但我怀疑NSWorkspace.frontmostApplication https://developer.apple.com/documentation/appkit/nsworkspace/1532097-frontmostapplication?language=objc可能用于确定“前台”应用程序)。
如果后台扫描可接受并且正在使用的蓝牙设备在广告数据中包含服务 UUID,则可以向scanForPeripheralsWithServices:options:
.
如果没有,那么您必须创建一个签名的 .app 才能使用前台扫描。
一些额外的细节和一个丑陋的解决方法,用于在没有 GUI 的情况下运行命令行工具作为 .app(在 XCode 调试器之外),可以在以下位置找到:https://github.com/hbldh/bleak/issues/720 https://github.com/hbldh/bleak/issues/720。此链接是特定于 Python 的,但应该能够将其推断到其他环境。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)