我编写了一个应用程序,需要在某个蓝牙低功耗设备进入范围内时获得通知。如果BLE设备被注意到,我的应用程序只会存储一个时间戳。
正如WWDC 2012核心蓝牙视频中所述,使用Core Bluetooth时,应用程序可以在后台模式中执行两种操作:
事件背景
事件背景可能是大多数应用程序 将在与蓝牙低功耗设备交互时使用。这个 模式不允许直接与附件通信 应用程序在后台,但确实提供了通知 当它想要与应用程序通信时的配件。 iOS会 当您的应用程序在。时保持与BTLE配件的连接 后台并将继续监控通知。当。。。的时候 已连接的BTLE附件有可用的通知,iOS将通知 允许的附件想要与您的应用程序通信的用户 用户加载您的应用程序并与附件交互。尽可能多 设备需要节省电力,仅提供信息 确定性时间将大大提高电池寿命 配件和iPhone 4S。
- 此模式不需要info.plist条目。
会话背景
有时候应用必须与之互动 即使它在后台运行也是一个配件。考虑一下 运行需要实时监控心率的应用。有一个 清除此模型的START和STOP。用户STARTS他们的运行 应用。运行时,App会读取心率信息 直到运行完成或停止。会话背景也 允许在App时扫描和连接BTLE配件 在后台。一个scanForPeripheralsWithServices或 connectPeripheral调用将继续,即使应用程序在 背景。 CoreBluetooth将继续监控具体情况 与您的应用正在寻找的服务相匹配的外围设备或外围设备 用于在找到或连接时调用您的Apps代理。铭记, 每当BTLE外围设备或iPhone 4S使用其无线电时,它就是 耗尽相应设备的可用功率。 App开发者 使用基于会话的后台处理必须注意电源使用情况。
- 会话后台处理需要在您的Apps info.plist中输入UIBackgroundModes(bluetooth-central)的后台模式。
直到现在我的会话背景(使用相应的info.plist条目)。该应用程序要求iOS检索所有已知设备,然后将connect命令提供给我正在寻找的设备。连接回调即使在我的应用程序后台运行几分钟后也会出现。
但是:应用程序在 - 比如说 - 一小时后被暂停。这意味着下次我的应用程序被用户启动时,它无法判断是否有任何感兴趣的BLE设备。
所以我的问题是:当某个BLE设备进入后台时,即使在被发送到后台几天后我的应用也可以在没有用户互动的情况下得到通知,这样我就可以存储我的时间戳了吗?
答案 0 :(得分:15)
从iOS 7开始,您的用例现在很容易支持。在iOS 7之前,您的应用程序可以注册有关该外围设备的通知,并且当系统收到通知时,它将在后台唤醒。但是,如果系统在您的应用程序背景或重新启动时遇到内存压力,则不会重新启动。 iOS 7将状态恢复添加到CBCentralManager
和CBPeripheralManager
,因此现在操作系统将以有限的容量重新启动您的应用程序,即使它由于上述任一条件而未运行。有关详细信息,请参阅CoreBluetooth guide。
简而言之,对于您的用例,您可以执行以下操作:
bluetooth-central
作为后台执行模式。答案 1 :(得分:3)
不,iOS不保证您的应用在后台保持活力。文档说:
但是,在应用程序在后台运行(未暂停)并且系统由于某种原因需要终止它的情况下,可能会调用此方法。
答案 2 :(得分:3)
使用IOS7 BLE状态保存&恢复强>
如果您的应用由于内存压力而终止<(>)(这就是为什么您的应用在几天之后无法工作),它就无法再处理蓝牙代表了。在这种情况下,如果您使用了State Preservation&amp;恢复,您的应用程序可以重新启动到后台再次运行,也只有10秒。 10秒后,它将进入暂停状态。 只有在这种情况下,才能触发CBCentralManager的willRestoreState。
祝你好运。