没有姓名或地址.CBCentralManager不再在macOS 12上工作



自从我将macOS更新到macOS 12以来,我在使用CoreBluetooth时遇到了麻烦。在我的一个应用程序中,我将列出使用CGCentralManager类的所有BLE设备。

这个方法已经有效多年了。但是现在,当我启动我的应用程序时,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控制台应用程序有很多这样的消息(我不知道这是否相关,这个过程是蓝牙而不是我的应用程序):

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

看来苹果已经更新了macOS,使其行为更像iOS。scanForPeripheralsWithServices的文档:options: say:

你的应用程序可以通过指定蓝牙中心后台模式在后台扫描蓝牙设备。要做到这一点,你的应用程序必须通过在serviceuuid参数中指定一个或多个服务来显式扫描它们。CBCentralManager扫描选项在后台扫描时没有效果。

命令行程序不能被认为是前台应用程序,因为它们不是。app,因此应用后台扫描规则。(这是猜测,但我怀疑NSWorkspace.frontmostApplication可能被用来确定"前景";应用程序)。

如果后台扫描是可接受的,并且正在使用的蓝牙设备在广告数据中包含服务UUID,则可以向scanForPeripheralsWithServices:options:提供服务UUID列表。

如果没有,那么你必须创建一个签名的。app来使用前台扫描。

在https://github.com/hbldh/bleak/issues/720上可以找到一些额外的细节和一个丑陋的解决方案,用于在没有GUI的情况下以.app的形式运行命令行工具(在XCode调试器之外)。此链接是特定于python的,但应该能够将其推断到其他环境。

相关内容

  • 没有找到相关文章

最新更新