iOS CoreBluetooth:状态保存和恢复

STE*_*TEX 6 iphone ios core-bluetooth bluetooth-lowenergy swift

希望在这里得到一些意见.

在我目前的iOS项目中,我使用的是带有swift的CoreBluetooth.该应用程序可以在后台使用CoreBluetooth进行通信,基本上可以正常工作.外围设备需要与iOS设备建立活动连接才能按预期工作.只要连接中断,外围设备就会停止当前操作.当应用程序因内存压力而关闭时,也会发生这种情况.在这种情况下,外围设备不应停止工作,因此存在问题.为了解决这个问题,我按照苹果核心蓝牙编程指南实现了状态保存和恢复后台模式,主要说:

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

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

现在手动重新启动应用程序时,没有提到的NSLogs出现.永远不会调用willRestoreState委托,并且launchOptions为nil.我在实例化CentralManager时尝试使用队列"DISPATCH_QUEUE_CONCURRENT"而不是nil.没有效果.

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

谢谢你的帮助.:)

STE*_*TEX 9

最后做了一些测试并得到了结果.事实证明,应用程序在需要时启动到后台,这意味着只要外围设备在保留的连接上发送数据.didFinishLaunchingWithOptions在这种情况下,iOS会启动应用程序,因此您有大约10秒的时间来检查您的启动选项并执行某些操作.所以我的问题与连接上没有数据发送的事实有关,似乎我们现在必须更改外围设备的固件来解决这个问题.

willRestoreState手动重新启动应用程序时会调用该委托.此时,iOS不仅提供最近使用的中央设备,还提供连接外围设备列表,甚至是最近订购的服务.因此,我只需要恢复我的对象,并从连接的外围设备的正确服务中获得订阅的特性,以便再次完全正常运行.

  • 您好STEX,请您帮我知道"我只需要恢复我的对象并从连接的外围设备的正确服务获得订阅的特性再次完全正常运行." 我面临类似的问题,并且无法使我的应用程序再次正常运行,因为我正在获取外围设备对象,但是我需要再次发送连接命令来建立连接,或者我只需要设置委托方法.提前致谢. (3认同)