corebluetooth和ios状态

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

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

问:有关ios应用程序状态的corebluetooth实现的最佳做法是什么? 特别:

  1. 用户打开应用程序时应该执行什么操作? (目前:我使用保存的标识符重新连接到设备..但这是必要的,因为核心蓝牙应该自动保持连接到设备)
  2. 什么应该实施当用户背景的应用程序?
  3. 当用户从后台重新打开应用程序时应该执行什么? (我应该重新连接到设备?)
  4. 当用户杀死应用程序时应该执行什么? corebluetooth连接是否断开连接?
  5. 当电池电量不足,蓝牙关机或关机时应该执行什么操作?

最后:

是否有必要在singleton类中实现corebluetooth库,以确保应用程序只使用一个蓝牙pipe理器连接到设备?

这里有一些build议和最好的(我可以看到他们)的做法。 这些并不是一成不变的

  1. 当用户打开应用程序时,它不一定重新连接到设备。 所以你的方法是好的。 但是,您应该检查应用程序是否要重新连接。
  2. 当用户背景的应用程序和设备连接,设备保持连接。 除非有一些特殊的情况,否则这里没有什么可实施 我们稍后再去找他们。
  3. 当用户将应用程序置于前台(从后台重新打开应用程序),并且在应用程序发送到后台之前已连接设备时,它仍保持连接状态。 所以没有在这里执行。
  4. 当用户杀死应用程序,设备断开连接,没有什么可以做的。 当用户再次打开应用程序时,您可以尝试重新连接到设备。
  5. 我会监视设备电池(稍后检查一次),当电池达到临界水平,比如说5%,断开与设备的连接。

最后:没有必要把它作为一个单例来实现。 当你只有一个对象处理所有的蓝牙连接时,这是非常方便的。 所以,我会说,单身人士是一个不错的select。

一般来说,你必须考虑两种情况:

  1. 该应用程序被系统杀死(可能是因为内存压力或崩溃)。 当应用程序在后台死亡时,系统将重新启动它,并func centralManager(_ central: CBCentralManager, willRestoreState dict: [String : Any])函数。 在这个function中,你应该尝试重新连接到蓝牙设备。 当应用程序在前台被系统杀死时,有时(从我的经验),相同的function将被调用。 所以你应该做同样的事情。 当它不叫 – 看到下面的段落。
  2. 该应用程序被用户杀害。 在这种情况下,你不能重新启动应用程序。 但是当用户再次打开它时,您应该检查最新的连接状态,并在需要时尝试重新连接到设备。 既然你保存连接的设备在UserDefaults (这是正确的事情),你应该有所有需要的属性。

对于任何其他情况 – 由于蓝牙closures(在设备上或在电话上)或由于设备超出范围而断开连接,系统将处理重新连接。 所以基本上,这里什么都不做。

再一次,这一切都不是刻在石头上。 这就是我实现它,它工作正常。