iOS 在后台模式中省略广告中的制造商数据

iOS omits manufacturer data from advertisement in background mode

我正在开发 iOS 应用程序,该应用程序使用 BLE 与我们定制的 BLE 单元进行通信。 我们想通过 BLE 自动向设备发送特定命令。

当用户靠近设备并满足特定条件时,应用程序应连接到设备,“登录”用户,通过 BLE 发送命令并立即断开连接。

这些具体标准基于广告中的制造商数据(即,当制造商数据的最后一个字节为 0x01 时,设备处于“可登录”状态,当“不可登录”时,最后一个字节为 0x00)。

在前台,这个机制完美无缺。 即使应用程序处于后台或终止(在 iPhone 上的仪表板中向上滑动),我们也希望这样做。

我们实现的机制:

这里的问题是无论我怎么尝试,广告:

  1. 有时根本就没有发现(貌似是时间问题?)
  2. 当它被发现时,它不包含制造商数据

有人遇到过类似的事情吗? 感谢您的帮助,祝您有愉快的一天!

应用程序在 iOS 后台时根本无法读取原始 BLE 制造商广告数据 -- 操作系统禁止它。

此规则的两个例外情况:

  1. iBeacon,它本身是作为一种特定类型的制造商广告来实现的。应用程序可以在 iOS 的后台检测到 iBeacon,尽管只有四个字节的可读数据(编码在主要和次要字段中)是完全可用的。如果你可以修改你的设备以这种方式发送信息,它就会做你想做的事。但是,您必须使用 CoreLocation API 来检测 iBeacon,因为 CoreBluetooth 不允许从 iBeacon 广告中读取制造商数据。如果您确实使用了 CoreLocation,则不能使用检测与 CoreBluetooth 建立蓝牙连接,因为这两个 API 是沙盒化的。

  2. 溢出区广告。后台 iOS 应用程序可以在后台阅读这些特殊类型的制造商广告,但前提是屏幕已打开。 (通常可以通过发送本地通知在特定时间强制打开屏幕。)请在此处查看我的博客 post 了解更多信息:http://www.davidgyoungtech.com/2020/05/07/hacking-the-overflow-area

检测制造商广告的另一种方法是使用带有附加数据的 BLE 服务广告。为此,您需要定义一个 16 位或 128 位的 GATT 服务 UUID,并发送带有附加数据字节的广告。 Eddystone beacon formats 以这种方式工作,并允许在 iOS 上在后台进行检测。如果您可以更改 BLE 硬件,这可能是最好的方法。