没有名字和地址。CBCentralManager不再在MacOS 12上工作名字、地址、工作、CBCentralManager

2023-09-03 14:50:46 作者:G.E.M.女神i

自从我将MacOS更新到MacOS12之后,我在使用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
今日综应 给我一个只给我108分的理由

MacOS控制台应用程序有很多这样的消息(我不知道这是否相关,进程是BluToothd,而不是我的应用程序):

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

如果我的应用程序没有运行,那么BluToototd进程似乎相当安静。一旦启动,蓝天进程似乎就出现了某种问题。问题是:哪一个?

禁用沙盒不会更改任何内容,因此我不认为这与缺少权限有关。

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

是否有人遇到过同样的问题?

推荐答案

更新:苹果似乎已经修复了MacOS12.3中的错误。

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

苹果似乎已经更新了MacOS,使其表现得更像iOS。docs for scanForPeripheralsWithServices:options:说:

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

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

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

如果不是,则必须创建签名的.app才能使用前台扫描。

在https://github.com/hbldh/bleak/issues/720中可以找到一些额外的细节和一个难看的解决方法,用于在没有图形用户界面的情况下将命令行工具作为.app运行(在XCode调试器之外)。此链接是特定于Python的,但您应该能够将其推断到其他环境。