我正在开发一个需要在某些情况下无限期连接到蓝牙外围设备的应用程序。
在继续我的问题之前,我想确认一下:
- 我正在初始化我
CBCoreBluetoothManager
的 indidFinishLaunchingWithOptions:
。 - 我启用了
bluetooth-central
后台功能。 - 我通过使用密钥初始化 Manager 来使用状态保存和恢复,并实现
willRestoreState
: - 在我的问题发生之前,我与我的外围设备建立了成功的连接,我得到了它的服务(我只是在寻找一个)和它的特性(我只是在寻找一个),我确实设置
setNotifyValue:
为YES
. 此外,无论是在前台还是后台,didUpdateValueForCharacteristic:
每次特征值更新时我都会收到回调。 - 我正在模拟“暂停状态”
kill(getpid(), SIGKILL)
(我还通过将应用程序放在后台进行了测试,并让它静置 1 小时以上) - 当我说暂停时,我指的是实际
Suspended
状态。我相信每个应用程序最终都会在后台运行一段时间后到达那里。
我遇到的问题是didUpdateValueForCharacteristic:
在应用程序暂停时获得回调。如果应用程序在后台,我会再次收到回调,但在暂停时不会。这意味着,应用程序不会被特征的值更新唤醒。
有趣的是,当我的应用程序处于暂停模式时,我走出外围设备范围以断开连接,然后回到范围内重新连接,应用程序将被唤醒,因为它会尝试恢复(它调用 willRestoreState:) 并在短时间内监听任何特征值更新。
总而言之,当我的应用程序处于挂起状态并且在外围设备范围内时,didUpdateValueForCharacteristic 不会被调用,这意味着应用程序不会被唤醒,我 100% 确定是特征值更新。但是,如果我走出外围设备的范围并重新进入,它会唤醒应用程序,因为我支持状态保护和恢复。
来自 Apple 的文档:
The system wakes up your app when any of the CBCentralManagerDelegate or CBPeripheralDelegate delegate methods are invoked, allowing your app to handle important central role events, such as when a connection is established or torn down, when a peripheral sends updated characteristic values, and when a central manager’s state changes.
看来我应该得到这些更新,有人遇到过这样的问题吗?
任何帮助表示赞赏!
提前致谢