corebluetooth 和 ios 状态

corebluetooth and ios states

使用 corebluetooth 库成功连接了我的 BLE 设备,并在我的 ios 应用程序上为它的某些服务设置了通知值。在前景和背景模式下工作正常。

我目前将设备的标识符保存到 UserDefaults 并需要 ios 设备始终连接到设备。

问题:在 ios 应用程序的状态下,核心蓝牙实施的最佳做法是什么?具体来说:

  1. 用户打开应用程序时应该执行什么操作? (目前:我使用保存的标识符重新连接到 ble 设备。但这是必要的,因为 corebluetooth 应该自动保持连接到设备)
  2. 当用户将应用程序后台化时应该执行什么?
  3. 当用户从后台重新打开应用程序时应该执行什么? (我应该重新连接到设备吗?)
  4. 当用户杀死应用程序时应该执行什么? corebluetooth 连接是否断开?
  5. 当电池电量低且蓝牙被设备断电或关闭时,应该如何实施?

最后:

是否有必要在单例中实现 corebluetooth 库class以确保应用程序仅使用一个蓝牙管理器连接到设备?

这里有一些建议和最佳(如我所见)实践。这些不是一成不变的:

  1. 当用户打开应用程序时,它不一定会重新连接到设备。所以你的方法很好。但是,您应该检查该应用是否要重新连接。
  2. 当用户将应用程序设置为后台且设备处于连接状态时,设备将保持连接状态。所以除非有特殊情况,否则这里没有什么可实现的。我们稍后会找到它们。
  3. 当用户将应用程序带到前台(从后台重新打开它)并且设备在应用程序发送到后台之前已连接时,它仍保持连接状态。所以这里没有什么可实现的。
  4. 当用户关闭应用程序时,设备将断开连接,您无能为力。您可以在用户再次打开应用时尝试重新连接设备。
  5. 我会监控设备电池(偶尔检查一次),当电池电量达到临界水平时,比如说 5%,断开与设备的连接。

最后:没有必要将其实现为单例。当你只有一个对象来处理所有的蓝牙连接时,这是非常方便的。所以,我想说,单例是一个不错的选择。

一般来说你要考虑两种情况:

  1. 应用程序被系统杀死(可能是因为内存压力或崩溃)。当应用程序在后台被杀死时,系统将重新启动它并调用 func centralManager(_ central: CBCentralManager, willRestoreState dict: [String : Any]) 函数。在此功能中,您应该尝试重新连接到蓝牙设备。当应用程序在前台被系统杀死时,有时(根据我的经验)会调用相同的函数。所以你应该做同样的事情。未调用时 - 请参阅以下段落。
  2. 应用被用户杀死。在这种情况下,您无法重新启动该应用程序。但是当用户再次打开它时,您应该检查最新的连接状态,并在需要时尝试重新连接到设备。由于您将连接的设备保存在 UserDefaults 中(这是正确的),您应该拥有所有需要的属性。

对于任何其他情况 - 因为蓝牙关闭(在设备上或 phone 上)或因为设备超出范围而断开连接,系统会处理重新连接。所以基本上,这里没什么可做的。

再说一遍,这一切都不是一成不变的。我就是这样实现的,效果很好。