核心蓝牙和背景:即使在后台模式下工作几天后,设备的检测和触发操作?
我写了一个应用程序,当某个蓝牙低功耗设备进入范围内时,需要获得通知。 如果BLE设备被发现,我的应用程序只是存储一个时间戳。
正如WWDC 2012核心蓝牙video所述,使用核心蓝牙时,有两种应用程序可以在后台模式下运行:
事件背景
事件背景可能是大多数应用程序在与低功耗蓝牙设备交互时使用的。 这个模式不允许在应用程序处于后台时直接与附件通信,但当它想要与应用程序通信时,会提供附件通知。 当您的应用程序在后台时,iOS将保持连接到BTLE附件,并将继续监视通知。 当连接BTLE附件有可用通知时,iOS会通知用户该附件想要与您的应用程序交谈,允许用户加载您的应用程序并与附件进行交互。 由于许多设备需要节能,因此只有在确定的时间提供信息才能大大延长配件和iPhone 4S的电池寿命。
- 此模式不需要info.plist条目。
会话背景
有时候应用程序必须与附件交互,即使它在后台运行。 考虑一个需要实时监测心率的正在运行的应用程序。 这个模型有一个明确的START和STOP。 用户开始在应用程序中运行。 运行处于激活状态时,应用程序将读取心率信息,直到运行结束或“已停止”。 会话背景也允许扫描和连接到BTLE配件,而应用程序在后台。 即使App在后台,scanForPeripheralsWithServices或connectPeripheral也将继续。 CoreBluetooth将继续监视与您的应用程序正在查找的服务相匹配的特定外围设备或外围设备,并在find或连接时调用您的应用程序委托。 请注意,每当BTLE外围设备或iPhone 4S使用其无线电时,都会耗尽相应设备的可用电量。 使用基于会话背景的应用程序开发人员必须注意电源使用情况。
- 会话背景需要在您的应用info.plist中的背景模式下进入UIBackgroundModes(蓝牙中央)。
到现在为止我会议背景(与相应的info.plist条目)。 该应用程序要求iOS检索所有已知设备,然后将connect命令提供给我正在查找的设备。 即使在我的应用程序背景后数分钟后连接callback。
但是:应用程序被暂停 – 比方说 – 一个小时。 这意味着下一次我的应用程序被用户启动,它不能分辨是否有任何目标的BLE感兴趣的设备。
所以我的问题是:是否有可能我的应用程序得到通知,甚至在发送到后台某个BLE设备进入范围后,甚至几天没有用户交互,所以我可以存储我的时间戳?
不,iOS不保证您的应用在后台保持活跃状态。 文档说:
但是,这种方法可能会在应用程序在后台运行(未挂起)并且由于某种原因需要终止系统的情况下调用。
( applicationWillTerminate文档)
从iOS 7开始,您的用例现在很容易支持。 在iOS 7之前,您的应用程序可以注册关于该外设的通知,并且当系统发出通知时,它将在后台被唤醒。 但是,如果系统受到内存压力,而您的应用程序是后台,或重新启动,它不会重新启动。 iOS 7为CBCentralManager
和CBPeripheralManager
添加了状态恢复CBPeripheralManager
,所以现在操作系统将会以有限的容量重新启动你的应用程序,即使它由于上述任何一种情况而没有运行。 有关更多信息,请参阅CoreBluetooth指南 。
总之,对于您的使用情况,您可以执行以下操作:
- 继续支持
bluetooth-central
作为后台执行模式。 - select国家保护和恢复,正如“添加国家保存和恢复的支持”中所述。
使用IOS7 BLE状态保存和恢复
如果你的应用程序被IOS终止,由于内存压力 (这就是为什么你的应用程序不能在几天后),它不能处理蓝牙委托了。 在这种情况下,如果您使用状态保存和恢复,您的应用程序可以重新启动后台运行,也只有10秒。 十几秒钟后,它将进入暂停状态。 只有在这种情况下,CBCentralManager的willRestoreState才能被触发。
祝你好运。
- 比较目标C – ARC不允许将’int’隐式转换为’id’
- 在iOS中存储“全局”对象的位置
- 是否有可能在iOS应用程序中运行XCTesttesting?
- 应该如何处理已经在进行中的NSUrlConnection?
- 如果在推送通知弹出窗口中单击“不允许”,回调方法是什么?
- 获取关系并显示在UITableView中
- 在Facebook iOS 3.1.1 SDK中使用FBSession openActiveSessionWithReadPermissions处理无效的accessToken
- NSDate是MemberOfClass:返回false?
- 将从AppDelegate的推送通知接收到的数据传递给ViewController