5

自从我将 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 并开始扫描。设备被发现。我的主应用程序没有触发委托功能。一个都没有。

有没有人遇到同样的问题?

4

1 回答 1

2

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


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

苹果似乎已经更新了 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 的,但应该能够将其外推到其他环境。

于 2022-01-10T18:36:21.407 回答