reconnecting/restoring 时 CoreBluetooth 外围服务变空
CoreBluetooth peripheral service becomes empty while reconnecting/restoring
在我的 iOS 应用程序中,我能够成功连接到 BLE 外围设备,发现服务并订阅特征,以便在特征值发生变化时应用程序得到通知。只要应用程序在后台运行,所有这些都不会发生任何问题。
但是当状态恢复发生时会出现问题。在 centralManager:willRestoreState:
方法中,我可以使用方法 retrieveConnectedPeripheralsWithServices:
检索以前连接的外围设备。但是当我在检索到的外围设备上调用 discoverServices:
方法时没有任何反应。 peripheral:didDiscoverServices:
方法永远不会被调用。检索到的外设服务的值 属性 也为空。 iOS 不缓存服务和特征吗?
注意:我们的 BLE 外围设备最初会宣传服务。当应用程序首次启动时,它会从外围设备读取值并将用户特定数据写入特征。 Post 写,外设停止广告服务。但是固件工程师声称,即使服务被外设停止,从状态恢复中检索到的外设也应该有缓存的服务。是真的吗?
您是否检查过通过retrieveConnectedPeripheralsWithServices:
检索到的外围设备的连接状态? CoreBluetooth 框架有一些您需要注意的怪癖,其中之一是 retrieveConnectedPeripheralsWithServices:
方法的行为:
当您通过上述方法获得外围设备时,它们可能仅在 系统级别 (iOS) 上连接,而不是在您的应用程序中连接(请参阅讨论部分在 API 文档中)。因此,您仍然需要在外围设备上调用 connect 才能正常使用它们。这是API documentation中的相应部分:
The list of connected peripherals can include those that are connected by other apps and that will need to be connected locally using the connectPeripheral:options: method before they can be used.
关于服务的缓存:iOS缓存任何发现的服务和相应的特征。只有几种方法可以强制 iOS 更新缓存:
- BLE 电源循环,例如,在“设置”应用中关闭和打开 BLE 或重新启动您的 iOS 设备
- 通过外围设备端的 GAP 服务发送 服务已更改 通知(需要活动连接)
注意:您还可以通过 Bluetooth Configuration Profile 从蓝牙堆栈激活日志消息。它们在调试 BLE 相关问题时非常有用,尤其是涉及自定义硬件时(即使日志使用起来有点麻烦)。
在我的 iOS 应用程序中,我能够成功连接到 BLE 外围设备,发现服务并订阅特征,以便在特征值发生变化时应用程序得到通知。只要应用程序在后台运行,所有这些都不会发生任何问题。
但是当状态恢复发生时会出现问题。在 centralManager:willRestoreState:
方法中,我可以使用方法 retrieveConnectedPeripheralsWithServices:
检索以前连接的外围设备。但是当我在检索到的外围设备上调用 discoverServices:
方法时没有任何反应。 peripheral:didDiscoverServices:
方法永远不会被调用。检索到的外设服务的值 属性 也为空。 iOS 不缓存服务和特征吗?
注意:我们的 BLE 外围设备最初会宣传服务。当应用程序首次启动时,它会从外围设备读取值并将用户特定数据写入特征。 Post 写,外设停止广告服务。但是固件工程师声称,即使服务被外设停止,从状态恢复中检索到的外设也应该有缓存的服务。是真的吗?
您是否检查过通过retrieveConnectedPeripheralsWithServices:
检索到的外围设备的连接状态? CoreBluetooth 框架有一些您需要注意的怪癖,其中之一是 retrieveConnectedPeripheralsWithServices:
方法的行为:
当您通过上述方法获得外围设备时,它们可能仅在 系统级别 (iOS) 上连接,而不是在您的应用程序中连接(请参阅讨论部分在 API 文档中)。因此,您仍然需要在外围设备上调用 connect 才能正常使用它们。这是API documentation中的相应部分:
The list of connected peripherals can include those that are connected by other apps and that will need to be connected locally using the connectPeripheral:options: method before they can be used.
关于服务的缓存:iOS缓存任何发现的服务和相应的特征。只有几种方法可以强制 iOS 更新缓存:
- BLE 电源循环,例如,在“设置”应用中关闭和打开 BLE 或重新启动您的 iOS 设备
- 通过外围设备端的 GAP 服务发送 服务已更改 通知(需要活动连接)
注意:您还可以通过 Bluetooth Configuration Profile 从蓝牙堆栈激活日志消息。它们在调试 BLE 相关问题时非常有用,尤其是涉及自定义硬件时(即使日志使用起来有点麻烦)。