corebluetooth 和 ios 状态
corebluetooth and ios states
使用 corebluetooth 库成功连接了我的 BLE 设备,并在我的 ios 应用程序上为它的某些服务设置了通知值。在前景和背景模式下工作正常。
我目前将设备的标识符保存到 UserDefaults 并需要 ios 设备始终连接到设备。
问题:在 ios 应用程序的状态下,核心蓝牙实施的最佳做法是什么?具体来说:
- 用户打开应用程序时应该执行什么操作? (目前:我使用保存的标识符重新连接到 ble 设备。但这是必要的,因为 corebluetooth 应该自动保持连接到设备)
- 当用户将应用程序后台化时应该执行什么?
- 当用户从后台重新打开应用程序时应该执行什么? (我应该重新连接到设备吗?)
- 当用户杀死应用程序时应该执行什么? corebluetooth 连接是否断开?
- 当电池电量低且蓝牙被设备断电或关闭时,应该如何实施?
最后:
是否有必要在单例中实现 corebluetooth 库class以确保应用程序仅使用一个蓝牙管理器连接到设备?
这里有一些建议和最佳(如我所见)实践。这些不是一成不变的:
- 当用户打开应用程序时,它不一定会重新连接到设备。所以你的方法很好。但是,您应该检查该应用是否要重新连接。
- 当用户将应用程序设置为后台且设备处于连接状态时,设备将保持连接状态。所以除非有特殊情况,否则这里没有什么可实现的。我们稍后会找到它们。
- 当用户将应用程序带到前台(从后台重新打开它)并且设备在应用程序发送到后台之前已连接时,它仍保持连接状态。所以这里没有什么可实现的。
- 当用户关闭应用程序时,设备将断开连接,您无能为力。您可以在用户再次打开应用时尝试重新连接设备。
- 我会监控设备电池(偶尔检查一次),当电池电量达到临界水平时,比如说 5%,断开与设备的连接。
最后:没有必要将其实现为单例。当你只有一个对象来处理所有的蓝牙连接时,这是非常方便的。所以,我想说,单例是一个不错的选择。
一般来说你要考虑两种情况:
- 应用程序被系统杀死(可能是因为内存压力或崩溃)。当应用程序在后台被杀死时,系统将重新启动它并调用
func centralManager(_ central: CBCentralManager, willRestoreState dict: [String : Any])
函数。在此功能中,您应该尝试重新连接到蓝牙设备。当应用程序在前台被系统杀死时,有时(根据我的经验)会调用相同的函数。所以你应该做同样的事情。未调用时 - 请参阅以下段落。
- 应用被用户杀死。在这种情况下,您无法重新启动该应用程序。但是当用户再次打开它时,您应该检查最新的连接状态,并在需要时尝试重新连接到设备。由于您将连接的设备保存在
UserDefaults
中(这是正确的),您应该拥有所有需要的属性。
对于任何其他情况 - 因为蓝牙关闭(在设备上或 phone 上)或因为设备超出范围而断开连接,系统会处理重新连接。所以基本上,这里没什么可做的。
再说一遍,这一切都不是一成不变的。我就是这样实现的,效果很好。
使用 corebluetooth 库成功连接了我的 BLE 设备,并在我的 ios 应用程序上为它的某些服务设置了通知值。在前景和背景模式下工作正常。
我目前将设备的标识符保存到 UserDefaults 并需要 ios 设备始终连接到设备。
问题:在 ios 应用程序的状态下,核心蓝牙实施的最佳做法是什么?具体来说:
- 用户打开应用程序时应该执行什么操作? (目前:我使用保存的标识符重新连接到 ble 设备。但这是必要的,因为 corebluetooth 应该自动保持连接到设备)
- 当用户将应用程序后台化时应该执行什么?
- 当用户从后台重新打开应用程序时应该执行什么? (我应该重新连接到设备吗?)
- 当用户杀死应用程序时应该执行什么? corebluetooth 连接是否断开?
- 当电池电量低且蓝牙被设备断电或关闭时,应该如何实施?
最后:
是否有必要在单例中实现 corebluetooth 库class以确保应用程序仅使用一个蓝牙管理器连接到设备?
这里有一些建议和最佳(如我所见)实践。这些不是一成不变的:
- 当用户打开应用程序时,它不一定会重新连接到设备。所以你的方法很好。但是,您应该检查该应用是否要重新连接。
- 当用户将应用程序设置为后台且设备处于连接状态时,设备将保持连接状态。所以除非有特殊情况,否则这里没有什么可实现的。我们稍后会找到它们。
- 当用户将应用程序带到前台(从后台重新打开它)并且设备在应用程序发送到后台之前已连接时,它仍保持连接状态。所以这里没有什么可实现的。
- 当用户关闭应用程序时,设备将断开连接,您无能为力。您可以在用户再次打开应用时尝试重新连接设备。
- 我会监控设备电池(偶尔检查一次),当电池电量达到临界水平时,比如说 5%,断开与设备的连接。
最后:没有必要将其实现为单例。当你只有一个对象来处理所有的蓝牙连接时,这是非常方便的。所以,我想说,单例是一个不错的选择。
一般来说你要考虑两种情况:
- 应用程序被系统杀死(可能是因为内存压力或崩溃)。当应用程序在后台被杀死时,系统将重新启动它并调用
func centralManager(_ central: CBCentralManager, willRestoreState dict: [String : Any])
函数。在此功能中,您应该尝试重新连接到蓝牙设备。当应用程序在前台被系统杀死时,有时(根据我的经验)会调用相同的函数。所以你应该做同样的事情。未调用时 - 请参阅以下段落。 - 应用被用户杀死。在这种情况下,您无法重新启动该应用程序。但是当用户再次打开它时,您应该检查最新的连接状态,并在需要时尝试重新连接到设备。由于您将连接的设备保存在
UserDefaults
中(这是正确的),您应该拥有所有需要的属性。
对于任何其他情况 - 因为蓝牙关闭(在设备上或 phone 上)或因为设备超出范围而断开连接,系统会处理重新连接。所以基本上,这里没什么可做的。
再说一遍,这一切都不是一成不变的。我就是这样实现的,效果很好。