当应用程序处于挂起状态时,未调用didUpdateValueForCharacteristic

时间:2017-09-26 23:25:38

标签: ios bluetooth core-bluetooth cbcentralmanager ios-background-mode

我开发的应用程序需要在某些情况下无限期地连接到蓝牙外设。

在继续提问之前,我想确认一下:

  • 我正在CBCoreBluetoothManager初始化我的didFinishLaunchingWithOptions:
  • 我启用了bluetooth-central个后台功能。
  • 我正在使用状态保存和恢复,通过使用密钥初始化Manager,并实施willRestoreState
  • 在我的问题发生之前,我与我的外围设备成功连接,我得到了它的服务(我只是寻找一个)和它的特性(我只是寻找一个)我为此将setNotifyValue:设置为YES。另外,在前景和背景中,每当特征值更新时,我都会在didUpdateValueForCharacteristic:上收到回调。
  • 我正在模拟"暂停状态"使用kill(getpid(), SIGKILL)(我还通过将应用程序放在后台进行测试,让它静置1小时+)
  • 当我说暂停时,我指的是实际的Suspended状态。我相信每个应用程序最终会在后台运行一段时间后到达那里。

我遇到的问题是,当应用暂停时,didUpdateValueForCharacteristic:会收到回调。如果应用程序在后台,我会再次收到回调,但在暂停时则不会。意思是,应用程序不会被特征值更新唤醒。

有趣的是,当我将应用程序置于暂停模式时,我走出外围设备范围断开连接,然后回到范围内重新连接,应用程序将被唤醒,因为它会尝试恢复(它调用willRestoreState :)并在短时间内,将监听任何特征值更新。

总结一下,当我的应用程序处于挂起状态,并且在Peripheral的范围内时,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.

似乎我应该收到这些更新,有没有人遇到这样的问题?

感谢任何帮助!

提前致谢

0 个答案:

没有答案