19

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

如 WWDC 2012 Core Bluetooth 视频中所述,在使用 Core Bluetooth 时,应用程序有两种可能在后台模式下运行:

事件背景

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

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

会话后台

有时应用程序必须与附件交互,即使它在后台运行。考虑一个需要实时监测心率的正在运行的应用程序。这个模型有一个明确的开始和停止。用户开始在应用程序中运行。当跑步处于活动状态时,应用程序会读取心率信息,直到跑步完成或停止。会话后台还允许在应用程序处于后台时扫描和连接到 BTLE 配件。即使应用程序在后台,scanForPeripheralsWithServices 或 connectPeripheral 调用仍将继续。CoreBluetooth 将继续监视与您的应用程序正在寻找的服务相匹配的特定外围设备或外围设备,并在找到或连接时调用您的应用程序委托。铭记,每次 BTLE 外设或 iPhone 4S 使用其无线电时,都会消耗相应设备的可用电量。使用基于会话的后台的应用程序开发人员必须注意电源使用情况。

  • 会话后台需要在您的 Apps info.plist 中进入 UIBackgroundModes、bluetooth-central 的后台模式条目。

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

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

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

4

3 回答 3

15

从 iOS 7 开始,您的用例现在很容易支持。在 iOS 7 之前,您的应用程序可以注册有关该外围设备的通知,并且当系统有通知要传递时,它会在后台被唤醒。但是,如果您的应用程序在后台运行或重新启动时系统受到内存压力,则不会重新启动它。CBCentralManageriOS 7 为和增加了状态恢复功能CBPeripheralManager,因此现在操作系统将以有限的容量重新启动您的应用程序,即使它由于上述任何一种情况而没有运行。有关更多信息,请参阅CoreBluetooth 指南

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

  • 继续支持bluetooth-central作为后台执行模式。
  • 选择加入国家保护和恢复,如“增加对国家保护和恢复的支持”中所述
于 2013-10-21T18:18:50.253 回答
3

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

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

applicationWillTerminate的文档)

于 2013-03-19T15:36:04.677 回答
3

使用 IOS7 BLE 状态保存和恢复

如果您的应用程序由于内存压力而被 IOS 终止(这就是您的应用程序在几天后无法运行的原因),它就无法再处理蓝牙代理了。在这种情况下,如果您使用了 State Preservation & Restoration,您的应用程序可以重新启动到后台再次运行,同样只有 10 秒。10s 后,它将进入暂停状态。 只有在这种情况下,CBCentralManager 的 willRestoreState 才能被触发。

祝你好运。

于 2014-03-07T08:21:52.877 回答