我面临的问题是,在应用程序进入后台后(2-10 秒后),L2CAP(或 NSStream)停止向应用程序通知事件。应用程序可能已被暂停(如预期)。
我的期望是,当有 BLE 活动时,应用程序应该被系统唤醒。 该应用程序支持“后台模式 - 使用 LE 配件”。还支持状态恢复)
以下是一些常见的用例(应用程序是'central')
1 和 2 非常可靠(即使在重新启动后)。
3 - 根本不起作用。遗憾的是我找不到任何相关文档,所以我认为它应该是相同的(与特征一样)
来自 Apple(关于“蓝牙中心”):
当您的应用程序声明这一点时,系统会将其从挂起状态唤醒,以允许其处理蓝牙相关事件
主要区别似乎是 L2CAP 构建在 NSStream 之上 - 但我不知道这在系统级别上有什么区别。 NSStream 在 RunLoop.main 上运行(默认)。
进一步,如果应用程序被挂起,并且外设执行 L2CAP 写入...(什么也没有发生),但是如果外设通知特性,它会唤醒应用程序并接收 L2CAP 消息+它可以继续接收 L2CAP 数据一段时间(2-10 秒)然后再次停止。这可能是一些解决方法(始终通过特征通知),但我希望这被记录下来......
L2CAP 是否不被视为“BLE”活动并且不会按设计唤醒应用程序?
进一步了解文档,
此外,当调用任何 CBCentralManagerDelegate 或 CBPeripheralDelegate 委托方法时,系统会唤醒您的应用程序,从而允许您的应用程序处理重要的中心角色事件,例如当建立或断开连接时、当外设发送更新的特征值时,以及当中央管理器的状态发生变化时。
这显然不包括“NSStream”回调...
iOS 17 似乎在后台修复了 BLE L2CAP CoC 通信。
我的测试结果:
iOS
16.6.1
:L2CAP 通道在后台不工作。
iOS
17.2.1
:L2CAP 通道在后台工作。