【发布时间】:2019-09-24 19:08:17
【问题描述】:
我正在使用一个蓝牙外围设备,在连接到它之后,它会来回发送一个 ACK,然后它才能真正向我发送我需要的数据。
流程是这样的:
- 发现外设
- 连接到外围设备
- 发现服务和特征
- 监听特定特征的更新
- 外设向此特征发送特殊消息
- 然后应用向外围设备发送一个 ACK
- 外设向我发送应用所需的数据
我已经在状态保存和恢复centralManager(_ central: CBCentralManager, willRestoreState dict: [String : Any])987654323@的协议方法中实现了所需的逻辑
问题 1:
当应用程序处于后台并且 iOS 决定接管蓝牙通信(出于资源原因)时,iOS 将如何管理步骤 5、6 和 7?
因为如果不能,那么外围设备将无法发送应用在第 7 步中需要的数据。
问题 2:
在我读到的文档中,iOS 可能会在几秒钟内启动您的应用程序。在这种情况下会执行我的根 ViewController 的 viewDidLoad 方法吗?这就是我实例化CBCentralManager
我找到的许多在线资源中的一些:
【问题讨论】:
-
我不确定您的问题 1 是什么意思:您的代码负责以适当的顺序与外围设备进行通信,即使它在后台也是如此。如果您想在后台执行操作,将蓝牙对象附加到视图控制器是一个坏主意。我建议你的应用委托拥有一个单例或一个对象
-
@Paulw11 问题 1 是基于 iOS 不会启动我的应用程序的印象,但会尝试处理与外围设备本身的所有通信(因为它必须出于资源原因终止我的应用程序)。
-
不,这不会发生。如果你有一个未决的发现、一个未决的“连接”或者你有一个关于特性的活动通知,那么 iOS 将重新启动你的应用程序,以便它可以处理发现、连接或通知。 iOS 无法代表您执行此操作;它不知道你想做什么。
-
@Paulw11 你是对的!我重构了一些代码,将其移到 AppDelegate 中,初始测试似乎给了我预期的结果。将运行它更长的时间来仔细检查。
标签: ios swift core-bluetooth state-restoration