BLE 外设在几个小时后与 iPhone 应用程序断开连接

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

我目前有一个连接到 BLE 设备的应用程序,能够交换数据包数据、向附近的其他 BLE 设备发送消息、在发生连接/断开连接时发出通知。问题是当手机被锁定并且应用程序被系统挂起/进入睡眠状态时。当持续时间很短时,应用程序会被唤醒并通知新消息。但几个小时过去后,设备完全断开连接。该应用程序的全部目的是接收这些消息,无论手机是否已锁定 2-4 个多小时(边缘情况)。我不知道它断开连接的确切时间......我只能进行几个小时的测试,或者在我从一夜的睡眠中醒来后,我无法在 XCode 上模拟这一点。

此应用程序使用开源内容,并且类似但不同的应用程序能够保持 BLE 连接更长时间。这个其他应用程序使用位置更新权限,而我的则没有。一些用户表示,即使他们仅在使用应用程序时设置了位置,他们的后台连接也是可靠的。我进行了测试,即使没有 GPS/位置/或消息通知更新发生,该应用程序仍能保持连接更长时间,而我的则不然。

我可以在不使用位置更新权限的情况下实现相同的连接可靠性吗?如果我实施某种“后台刷新”或“充当蓝牙 LE 配件”会怎么样?如果我的应用程序每小时至少收到 1 条通知,是否会阻止这种情况发生?我阅读了苹果公司的“添加对状态保存和恢复的支持”文档,它没有很好的记录,但我会这样做吗?您建议什么选择?

ios swift bluetooth-lowenergy core-bluetooth
1个回答
0
投票

核心蓝牙为长期后台操作提供了非常好的支持。它可以处理应用程序在挂起时被 iOS 停止(由于内存或其他资源压力)以及设备本身因某种原因断开连接(超出范围、断电等)的情况。

要使其正常工作,您需要确保您已选择核心蓝牙状态恢复。这在此 Apple 文档中进行了描述 - 尽管它是旧文档,但它仍然有效。

总体策略是:

  • 在 Xcode 项目中启用核心蓝牙后台权限
  • 创建
    CBCentralManager
    时,通过
    CBCentralManagerOptionRestoreIdentifierKey
  • 为其指定一个标识符
  • 当您收到对中央管理器的
    didDisconnect
    委托方法的调用时,请立即在外围设备上调用
    connect
  • 如果在您的应用程序仍在运行时外围设备变得可连接,您将收到对
    didConnect
    委托方法的调用,并且您将照常处理
  • 如果您的应用程序已终止并且外围设备可以连接,iOS 将在后台重新启动您的应用程序。使用相同的恢复标识符重新创建
    CBCentralManager
    后,您将收到对
    didConnect
    委托方法的调用,并照常进行处理
© www.soinside.com 2019 - 2024. All rights reserved.