iOS CoreBluetooth:状态保存和恢复

希望在这里得到一些input。

在我目前的iOS项目中,我正在使用CoreBluetooth和Swift。 该应用程序是启用沟通使用CoreBluetooth在基本上工作的背景,种。 外围设备需要与iOS设备进行有效连接才能按预期工作。 只要连接中断,外设就会停止当前操作。 当应用程序由于内存压力而closures时也会发生这种情况。 在这种情况下,外设不应该停止工作,所以有一个问题。 为了解决这个问题,我遵循了苹果核心蓝牙编程指南来实现状态保存和恢复的背景模式,基本上说:

  1. 使用恢复标识符初始化CentralManager。 委托=自我。
  2. 实现willRestoreState委托方法。 NSLog的东西
  3. 检查launchOptions的特殊键。 NSLog的东西。

我强制iOS使用这个通用项目closures应用程序: BackgroundKill 。 当然,应用程序不再以debugging模式运行,这就是为什么我在重要点添加了一些NSLog语句来查找设备控制台。 好消息是,当应用程序终止时,连接不会被取消,iOS现在按预期保持连接,所以外设不会停止工作。 罢工! 除了应用程序订购的电池服务之外,在此期间中央和外围设备之间没有任何通信。 进行有效连接的唯一原因是为了防止外围设备停止工作。

当手动重新启动应用程序时,没有提到的NSLogs出现。 willRestoreState委托永远不会被调用,launchOptions是零。 我尝试使用队列“DISPATCH_QUEUE_CONCURRENT”而不是nil来实例化CentralManager。 没有效果。

当重新启动应用程序时,我该如何使用保存的连接? 为什么willRestoreState委托从不调用? 我在这里错过了什么? 系统为了使用状态保存和恢复而在后台/强制closures时接收数据是强制性的?

感谢您的帮助。 🙂

最后做了一些testing,并得到了结果。 事实certificate,应用程序是在需要的时候启动到后台,这意味着每当外设在保留的连接上发送数据 。 iOS在这种情况下通过didFinishLaunchingWithOptions启动应用程序,所以你有10秒钟来检查你的启动选项,并做一些事情。 所以我的问题与连接上没有数据发送有关,似乎我们现在必须改变我们的外设的固件来解决这个问题。

willRestoreState在手动重新启动应用程序时被调用。 此时,iOS不仅提供最近使用的中央服务器,还提供连接的外设列表,甚至最近订阅的服务。 所以我只需恢复我的对象,并从所连接的外设的正确服务中获得订阅的特性,以再次充分发挥function。