在我的iOS应用程序中,我能够成功连接到BLE外围设备,发现服务并订阅特征,以便在特征值发生变化时通知应用程序。只要app在后台运行,所有这些都没有问题。
但是当状态恢复发生时会出现问题。在centralManager:willRestoreState:
方法中,我可以使用retrieveConnectedPeripheralsWithServices:
方法检索以前连接的外围设备。但是当我在检索到的外围设备上调用discoverServices:
方法时,没有任何反应。永远不会调用peripheral:didDiscoverServices:
方法。检索到的外围设备服务属性的值也为空。 iOS不会缓存服务和特征吗?
注意:我们的BLE外围设备最初宣传服务。当应用程序第一次启动时,它会从外围设备读取值并将用户特定数据写入特征。邮政写作,外围停止广告服务。但是固件工程师声称即使服务被外围设备停止,从状态恢复中检索的外围设备也应该具有缓存服务。这是真的吗?
答案 0 :(得分:2)
您是否检查过通过retrieveConnectedPeripheralsWithServices:
检索到的外围设备的连接状态? CoreBluetooth框架有一些你需要注意的怪癖,一个是retrieveConnectedPeripheralsWithServices:
方法的行为:
当您通过上述方法获取外围设备时,它们可能只能连接到系统级(iOS),而不能连接到您的应用程序中(请参阅API文档中的“讨论”部分)。因此,您仍然需要在外围设备上调用connect才能正确使用它们。以下是API documentation:
中的相应部分连接的外围设备列表可以包括那些由其他应用程序连接的外围设备,这些外围设备需要先使用connectPeripheral:options:方法在本地连接才能使用。
关于服务的缓存:iOS缓存任何发现的服务和相应的特征。只有强制iOS更新缓存的方法:
注意:您还可以通过Bluetooth Configuration Profile激活蓝牙堆栈中的日志消息。在调试BLE相关问题时,它们非常有用,特别是涉及自定义硬件时(即使日志使用起来有点麻烦)。