没有姓名或地址。CBCentralManager 不再在 macOS 12 上运行

ine*_*tus 5 bluetooth core-bluetooth cbcentralmanager macos-monterey

自从我将 macOS 更新到 macOS 12 以来,我每次在使用 CoreBluetooth 时都会遇到问题。在我的一个应用程序中,我将列出使用该类的所有 BLE 设备CGCentralManager

这已经有效多年了。但现在,当我启动应用程序时,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
Run Code Online (Sandbox Code Playgroud)

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
Run Code Online (Sandbox Code Playgroud)

如果我的应用程序没有运行,蓝牙进程似乎相当安静。一旦启动,蓝牙进程似乎有某种问题。问题是:哪一个?

禁用沙箱并没有改变任何东西,所以我不认为它与缺少权限有关。

我还在一个新应用程序中构建了一个非常基本的示例。我实例化了一个新的 CBCentralManager 并开始扫描。这些设备被发现了。我的主应用程序没有触发委托功能。一个都没有。

有人遇到同样的问题吗?

Dav*_*ner 3

更新:Apple 似乎已经修复了 macOS 12.3 中的错误。


下面的原始答案适用于 12.0、12.1 和 12.2。

Apple 似乎已经更新了 macOS,使其表现得更像 iOS。scanForPeripheralsWithServices:options: 的文档说:

您的应用程序可以通过指定bluetooth-central后台模式在后台扫描蓝牙设备。为此,您的应用必须通过在 serviceUUIDs 参数中指定来显式扫描一项或多项服务。在后台扫描时,CBCentralManager 扫描选项无效。

命令行程序永远不能被视为前台应用程序,因为它们不是 .app,因此适用后台扫描规则。(这是推测,但我怀疑NSWorkspace.frontmostApplication可能用于确定“前台”应用程序)。

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

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

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