应用程序处于后台时,CBL2CAPChannel 不响应

问题描述 投票:0回答:2

我面临的问题是,在应用程序进入后台后(2-10 秒后),L2CAP(或 NSStream)停止向应用程序通知事件。应用程序可能已被暂停(如预期)。

我的期望是,当有 BLE 活动时,应用程序应该被系统唤醒。 该应用程序支持“后台模式 - 使用 LE 配件”。还支持状态恢复)

以下是一些常见的用例(应用程序是'central'

  1. 应用程序触发了“连接”..应用程序被暂停..外围设备进入范围 -> 应用程序唤醒(有效)
  2. 应用程序已连接..应用程序被暂停..外围设备更新通知特征 -> 应用程序唤醒(有效)
  3. 应用程序已连接..应用程序被暂停..外设通过 L2CAP 写入 -> 应用程序唤醒(不起作用)

1 和 2 非常可靠(即使在重新启动后)。

3 - 根本不起作用。遗憾的是我找不到任何相关文档,所以我认为它应该是相同的(与特征一样)

来自 Apple(关于“蓝牙中心”):

当您的应用程序声明这一点时,系统会将其从挂起状态唤醒,以允许其处理蓝牙相关事件

主要区别似乎是 L2CAP 构建在 NSStream 之上 - 但我不知道这在系统级别上有什么区别。 NSStream 在 RunLoop.main 上运行(默认)。

进一步,如果应用程序被挂起,并且外设执行 L2CAP 写入...(什么也没有发生),但是如果外设通知特性,它会唤醒应用程序并接收 L2CAP 消息+它可以继续接收 L2CAP 数据一段时间(2-10 秒)然后再次停止。这可能是一些解决方法(始终通过特征通知),但我希望这被记录下来......

L2CAP 是否不被视为“BLE”活动并且不会按设计唤醒应用程序?

进一步了解文档,

此外,当调用任何 CBCentralManagerDelegate 或 CBPeripheralDelegate 委托方法时,系统会唤醒您的应用程序,从而允许您的应用程序处理重要的中心角色事件,例如当建立或断开连接时、当外设发送更新的特征值时,以及当中央管理器的状态发生变化时。

这显然不包括“NSStream”回调...

ios core-bluetooth nsstream ios-background-mode l2cap
2个回答
1
投票

iOS 17 似乎在后台修复了 BLE L2CAP CoC 通信。


0
投票

我的测试结果:

iOS

16.6.1
:L2CAP 通道在后台不工作。

iOS

17.2.1
:L2CAP 通道在后台工作。

© www.soinside.com 2019 - 2024. All rights reserved.