iOS 核心蓝牙 : State Preservation and Restoration

标签 ios iphone swift bluetooth-lowenergy core-bluetooth

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

在我当前的 iOS 项目中,我使用 CoreBluetooth 和 swift。该应用程序可以在后台使用 CoreBluetooth 进行通信,这基本上可以正常工作。外围设备需要与 iOS 设备建立有效连接才能按预期工作。每当连接中断时,外围设备都会停止其当前操作。当应用程序由于内存压力而关闭时也会发生这种情况。在那种情况下,外围设备不应该停止工作,所以有问题。为了解决,我关注了apples core bluetooth programming guide实现状态保存和恢复后台模式,基本上说:

  1. 使用恢复标识符初始化 CentralManager。代表 = self 。
  2. 实现 willRestoreState 委托(delegate)方法。 NSLog 的东西
  3. 检查特殊键的启动选项。 NSLog 的东西。

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

现在手动重新启动应用程序时,上述 NSLog 均未显示。永远不会调用 willRestoreState 委托(delegate),并且 launchOptions 为零。在实例化 CentralManager 时,我尝试使用队列“DISPATCH_QUEUE_CONCURRENT”而不是 nil。没有效果。

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

感谢您的帮助。 :)

最佳答案

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

委托(delegate) willRestoreState 在手动重新启动应用程序时被调用。此时 iOS 不仅提供了最近使用的 central,还提供了连接的外围设备列表,甚至是最近订阅的服务。所以我只需要恢复我的对象并从连接的外围设备的正确服务中获取订阅的特性,以便再次完全正常运行。

关于iOS 核心蓝牙 : State Preservation and Restoration,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27797665/

相关文章:

iphone - 找出一个 NSDate 是今天、昨天、明天

view - 如何以编程方式使用另一个 View 中的按钮从 Storyboard 中打开 UIViewController?

ios - MVC 模型 - Controller 应该直接访问 View 的控件吗?

iphone - IframeExtractor 不使用 rtsp 输出声音

iphone - 如何为 UIScrollView 中的内容区域设置背景颜色?

iphone - iOS 中的 3D 文字效果

iphone - 核心数据,一对多关系

swift - 如何用 Swift 代码在 SpriteKit 上放置按钮?

swift 推迟特殊性 : why is code in case:defer is invoked before the end of the switch scope?

ios - 使用 xib 自定义 UITableViewCell