核心蓝牙和后台处理:即使在后台模式下工作几天,也可以检测设备并触发操作?

Nor*_*ert 19 iphone ios core-bluetooth bluetooth-lowenergy

我写了一个应用程序,需要在某个蓝牙低功耗设备进入范围内时获得通知.如果BLE设备被注意到,我的应用程序只存储一个时间戳.

如WWDC 2012核心蓝牙视频中所述,使用Core Bluetooth时,应用程序可以在后台模式中执行两种操作:

事件背景

事件背景可能是大多数应用程序在与蓝牙低功耗设备交互时将使用的内容.当App处于后台时,此模式不允许与附件直接通信,但是当它想要与应用程序通信时确实提供来自附件的通知.当您的应用程序在后台时,iOS将保持与BTLE附件的连接,并将继续监视通知.当连接的BTLE附件有可用通知时,iOS将通知用户该附件想要与您的应用程序通信,允许用户加载您的应用程序并与附件进行交互.由于许多设备需要节省电力,因此仅在确定时间提供信息将大大延长配件和iPhone 4S的电池寿命.

  • 此模式不需要info.plist条目.

会话背景

有时候应用程序必须与附件交互,即使它在后台运行.考虑一个需要实时监控心率的运行应用.这个模型有一个明确的START和STOP.用户在应用程序中运行它们.当运行处于活动状态时,应用程序会读取心率信息,直到运行完成或停止.在App处于后台时,会话后台还允许扫描和连接到BTLE附件.即使应用程序在后台,scanForPeripheralsWithServices或connectPeripheral也会继续调用.CoreBluetooth将继续监控与您正在寻找的服务相匹配的特定外围设备或外围设备,并在找到或连接时致电您的应用代表.请注意,每次BTLE外围设备或iPhone 4S使用其无线电时,它都会耗尽各自的设备可用功率.使用基于会话的后台处理的应用程序开发人员必须注意使用电源.

  • 会话后台处理需要在您的Apps info.plist中输入UIBackgroundModes(bluetooth-central)的后台模式.

到目前为止我的Session Backgrounding(使用相应的info.plist条目).该应用程序要求iOS检索所有已知设备,然后将connect命令提供给我正在寻找的设备.连接回调即使在我的应用程序后台运行几分钟后也会出现.

但是:应用程序在 - 比如说 - 一小时后被暂停.这意味着下次我的应用程序被用户启动时,它无法判断是否有任何感兴趣的BLE设备.

所以我的问题是:当某个BLE设备进入后台时,即使在被发送到后台几天后我的应用程序也可以在没有用户交互的情况下得到通知,这样我就可以存储我的时间戳了吗?

cbo*_*wns 15

从iOS 7开始,您的用例现在很容易支持.在iOS 7之前,您的应用程序可以注册有关该外围设备的通知,并且当系统收到通知时,它将在后台唤醒.但是,如果系统在您的应用程序背景或重新启动时遇到内存压力,则不会重新启动.iOS的7加状态恢复到CBCentralManagerCBPeripheralManager,所以现在的操作系统将重新启动你的能力是有限的,即使它没有运行的应用程序对任何一方的上述条件.有关详细信息,请参阅CoreBluetooth指南.

简而言之,对于您的用例,您可以执行以下操作:

  • 继续支持bluetooth-central作为后台执行模式.
  • 选择启用状态保存和恢复,如记录在这里下的"添加支持国家保护修缮".


Chr*_*ger 3

不,iOS 不保证您的应用程序在后台保持活动状态。文档说:

但是,当应用程序在后台运行(未挂起)并且系统因某种原因需要终止它的情况下,可能会调用此方法。

applicationWillTerminate的文档)

  • 该应用程序可能使用推送通知。为此,该应用程序不必在后台运行。 (3认同)