希望在这里得到一些意见。
在我目前的iOS项目中,我使用的是带有swift的CoreBluetooth。该应用程序可以在后台使用CoreBluetooth进行通信,基本上可以正常工作。外围设备需要与iOS设备建立活动连接才能按预期工作。只要连接中断,外围设备就会停止当前操作。当应用程序因内存压力而关闭时,也会发生这种情况。在这种情况下,外围设备不应该停止工作,因此存在问题。为了解决这个问题,我跟着apples core bluetooth programming guide实现了状态保存和恢复后台模式,基本上说:
我强制iOS使用此常见项目在后台关闭应用程序:BackgroundKill。当然应用程序不再以调试模式运行,这就是为什么我在重要的位置添加一些NSLog语句以在设备控制台中查找。好消息:当应用程序终止时,连接不再被取消,iOS现在按预期运行以保持连接,因此外围设备不会停止工作。罢工!除了应用订阅的电池服务之外,在此期间中央和外围设备之间没有通信。建立有效连接的唯一原因是防止外围设备停止工作。
现在手动重新启动应用程序时,没有提到的NSLogs出现。永远不会调用willRestoreState委托,并且launchOptions为nil。我试图使用队列" DISPATCH_QUEUE_CONCURRENT"实例化CentralManager时代替nil。没有效果。
重新启动应用时,我应该如何使用保留的连接?为什么从不调用willRestoreState委托?我在这里错过了什么吗?为了使用状态保存和恢复,是否必须在系统后台/强制关闭时接收数据?
感谢您的帮助。 :)
答案 0 :(得分:8)
最后做了一些测试并得到了结果。事实证明,当需要时,应用程序会启动到后台,这意味着只要外围设备在保留的连接上发送数据,就会。在这种情况下,iOS通过didFinishLaunchingWithOptions
启动应用程序,因此您有大约10秒的时间来检查您的启动选项并执行某些操作。所以我的问题与连接上没有数据发送有关,似乎我们现在必须更改外围设备的固件来解决这个问题。
手动重新启动应用时会调用委托willRestoreState
。此时,iOS不仅提供最近使用的中央设备,还提供连接外围设备列表,甚至是最近订购的服务。因此,我只需要恢复我的对象,并从连接的外围设备的正确服务中获得订阅的特性,以便再次完全正常运行。