在不打开 App(或在后台)的情况下通过 iOS 通过 BLE 同步数据

Syncing data over BLE via iOS without App Open (or in the background)

我正在研究一种在门关闭时保持计数的设备。我想做的是,当我走进门时,我的 iPhone 会自动同步设备上的数据并将该计数发送到服务器(通过 iPhone),而无需我打开应用程序或它在后台。这可能吗,如果可能的话如何?

这是我的想法的图表:

Door closes -> BLE notifies iPhone -> BLE sends count to iPhone -> iPhone sends that value to server

无需用户(我)触摸我的设备或打开已安装的 iOS 应用程序。

您的应用程序必须 运行 在后台才能执行某些操作,但这没关系,因为 Core Bluetooth 后台模式会为您处理。

首先,您需要在您的项目中select "Uses Bluetooth accessories"后台模式。

现在,您的程序流程将如下所示:

  1. 您的用户运行您的应用程序,它会扫描可用的门并将其显示给用户
  2. 您的用户select是他们想要连接的门
  3. 您将 selected 外围设备的标识符保存在某个地方,例如 NSUserDefaults
  4. 你连接外设
  5. 调用 didConnectPeripheral 委托方法后,您可以读取计数并在获得值后更新服务器
  6. 用户现在可以暂停您的应用并执行其他操作
  7. 最终外围设备将超出范围,您将接到 didDisconnectPeripheral 的电话。在这种方法中,您立即重新发出与外围设备的连接。
  8. 因为你有 Core Bluetooth 后台模式,当外围设备最终再次出现时,你将在后台再次调用 didConnectPeripheral,你可以按照第 5 步继续(在这种情况下,你的应用程序是已经在后台,所以它会在您读取数据后返回挂起状态,而无需用户执行任何操作)。

您在步骤 5 中更新了服务器。无论应用程序是在前台还是后台,都会执行此步骤。用户不需要打开您的应用程序。

现在最终 iOS 可能会将您的应用程序从挂起状态中删除,例如由于内存压力。为了在看到外围设备时仍然能够连接到外围设备,您需要按照 Core Bluetooth Programming Guide

中所述选择进入状态恢复

如果您准备构建自己的电路板和蓝牙 LE 固件,这非常简单:

  1. 添加一个接触开关,只要门打开,它就会向电路板发送电压电平变化。
  2. 当电平变化时增加微控制器上的计数器。
  3. 编写固件来通告 iBeacon 数据包,其中计数器作为 iBeacon 标识符的最低有效部分(32 位主要和次要)。

A phone 然后可以通过使用 CoreLocation API 来监视信标(用于快速后台唤醒)和范围(以读取特定标识符)来获取此计数器,然后发送计数器值根据读取的标识符发送到服务器。

使用 CoreLocation 而不是 CoreBluetooth 的优势正如 @paulw11 在他非常好的答案中所暗示的那样是更快的应用程序后台唤醒,允许应用程序在后台可靠地读取计数器。使用 CoreBluetooth,这种后台唤醒可以慢得多,并且更有可能错过开门事件。