【问题标题】:CoreBluetooth and State Preservation & Restoration when peripheral needs special ACK外围设备需要特殊 ACK 时的 CoreBluetooth 和状态保存和恢复
【发布时间】:2019-09-24 19:08:17
【问题描述】:

我正在使用一个蓝牙外围设备,在连接到它之后,它会来回发送一个 ACK​​,然后它才能真正向我发送我需要的数据。

流程是这样的:

  1. 发现外设
  2. 连接到外围设备
  3. 发现服务和特征
  4. 监听特定特征的更新
  5. 外设向此特征发送特殊消息
  6. 然后应用向外围设备发送一个 ACK​​
  7. 外设向我发送应用所需的数据

我已经在状态保存和恢复centralManager(_ central: CBCentralManager, willRestoreState dict: [String : Any])987654323@的协议方法中实现了所需的逻辑

问题 1:

当应用程序处于后台并且 iOS 决定接管蓝牙通信(出于资源原因)时,iOS 将如何管理步骤 5、6 和 7?

因为如果不能,那么外围设备将无法发送应用在第 7 步中需要的数据。

问题 2:

在我读到的文档中,iOS 可能会在几秒钟内启动您的应用程序。在这种情况下会执行我的根 ViewController 的 viewDidLoad 方法吗?这就是我实例化CBCentralManager


我找到的许多在线资源中的一些:

Core Bluetooth Background Processing for iOS Apps

Zero to BLE on iOS – Part Three

【问题讨论】:

  • 我不确定您的问题 1 是什么意思:您的代码负责以适当的顺序与外围设备进行通信,即使它在后台也是如此。如果您想在后台执行操作,将蓝牙对象附加到视图控制器是一个坏主意。我建议你的应用委托拥有一个单例或一个对象
  • @Paulw11 问题 1 是基于 iOS 不会启动我的应用程序的印象,但会尝试处理与外围设备本身的所有通信(因为它必须出于资源原因终止我的应用程序)。
  • 不,这不会发生。如果你有一个未决的发现、一个未决的“连接”或者你有一个关于特性的活动通知,那么 iOS 将重新启动你的应用程序,以便它可以处理发现、连接或通知。 iOS 无法代表您执行此操作;它不知道你想做什么。
  • @Paulw11 你是对的!我重构了一些代码,将其移到 AppDelegate 中,初始测试似乎给了我预期的结果。将运行它更长的时间来仔细检查。

标签: ios swift core-bluetooth state-restoration


【解决方案1】:

Paulw11 的这两个 cmets 帮助我理解了发生了什么:

不,这不会发生。如果你有一个未决的发现、一个未决的“连接”或者你有一个关于特性的活动通知,那么 iOS 将重新启动你的应用程序,以便它可以处理发现、连接或通知。 iOS 无法代表您执行此操作;它不知道你想做什么。 – Paulw11


如果您想在后台执行操作,将蓝牙对象附加到视图控制器是个坏主意。我建议你的应用程序委托拥有一个单例或一个对象 - Paulw11


首先,我错误地假设当我的应用程序在后台并且 iOS 不得不终止它时,iOS 将尝试代表我的应用程序处理所有蓝牙通信。现实情况是,iOS 会在有限的时间内以后台模式启动应用程序,以便您可以运行恢复代码。

最后,我的 ViewController 的 viewDidLoad 中的逻辑是错误的。我创建了一个BluetoothManager 类,并在我的AppDelegateapplication(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool 方法中实例化了它

【讨论】:

    猜你喜欢
    • 2016-01-12
    • 2016-01-12
    • 1970-01-01
    • 2012-09-16
    • 1970-01-01
    • 1970-01-01
    • 2014-05-14
    • 2013-08-31
    • 2022-01-26
    相关资源
    最近更新 更多