iOS 在后台模式下从广告中省略制造商数据
Posted
技术标签:
【中文标题】iOS 在后台模式下从广告中省略制造商数据【英文标题】:iOS omits manufacturer data from advertisement in background mode 【发布时间】:2020-07-30 14:32:46 【问题描述】:我在使用 BLE 与我们定制的 BLE 单元进行通信的 ios 应用程序上工作。 我们希望通过 BLE 自动向设备发送特定命令。
当用户靠近设备并满足特定条件时,应用程序应连接到设备,“登录”用户,通过 BLE 发送命令并立即断开连接。
这些特定标准基于广告中的制造商数据(即,当制造商数据的最后一个字节为 0x01 时,设备处于“可登录”状态,当它“不可登录”时,最后一个字节为 0x00)。
在前台,这种机制完美无缺。 即使应用程序处于后台或终止状态(在 iPhone 上的仪表板中向上滑动),我们也希望这样做。
我们实现的机制:
该单元具有充当 iBeacon 的能力 当设备无法登录时,iBeacon 处于关闭状态 当它可用于登录时,iBeacon 将打开并唤醒应用程序,此时 BLE 扫描将以后台模式开始 后台模式设置为蓝牙中心这里的问题是,无论我尝试什么,广告:
-
有时根本没有发现(看起来是时间问题?)
被发现时不包含制造商数据
有没有人遇到过类似的事情? 感谢您提供任何帮助,祝您有愉快的一天!
【问题讨论】:
这篇文章可能会有所帮助:medium.com/@cbartel/… 谢谢,我看了几遍。他的问题是根本没有在后台模式下发现外围设备。就我而言,这种发现有时会发生。 【参考方案1】:应用在 iOS 后台时根本无法读取原始 BLE 制造商广告数据——操作系统禁止它。
此规则有两个例外:
iBeacon,它本身被实现为一种特定类型的制造商广告。一个应用程序可以在 iOS 的后台检测 iBeacons,尽管只有四个字节的可读数据(编码在主要和次要字段中)是完全可用的。如果你可以修改你的设备以这种方式发送信息,它会做你想做的事。但是,您必须使用 CoreLocation API 来检测 iBeacon,因为 CoreBluetooth 不允许从 iBeacon 广告中读取制造商数据。如果您使用 CoreLocation,则无法使用检测与 CoreBluetooth 建立蓝牙连接,因为这两个 API 已被沙盒化。
溢出区广告。后台 iOS 应用程序可以在后台读取这些特殊类型的制造商广告,但前提是屏幕打开。 (通常可以通过发送本地通知在特定时间强制屏幕打开。)请参阅我的博客文章以获取更多信息:http://www.davidgyoungtech.com/2020/05/07/hacking-the-overflow-area
检测制造商广告的另一种方法是使用带有附加数据的 BLE 服务广告。为此,您需要定义一个 16 位或 128 位 GATT 服务 UUID 并发送带有附加数据字节的广告。 Eddystone beacon formats 以这种方式工作,并允许在 iOS 的后台进行检测。如果您可以更改 BLE 硬件,这可能是最好的方法。
【讨论】:
@davidyoung 所以我不能同时使用 CoreLocation 和 CoreBluetooth?比如监控 iBeacon 和扫描 BLE 广告? 你绝对可以同时使用这两个,是的。然而,没有办法将一个检测与另一个检测相关联。当您检测到带有标识符的信标(ProximityUUID:2F234454-CF6D-4A0F-ADF2-F4911BA9FFA6,主要:12,次要:127)并且您检测到具有 CoreBluetooth peripheralID 0A82ED1E-5043-49F9-9B77-C0765A17C9AB 的完全相同的蓝牙设备时,有无法以编程方式将 CoreBluetooth 外围设备与 iBeacon 检测相关联,即使它们是同一设备。 Apple 故意将它们沙箱化,因此您无法执行此操作。 当然,您可以公开 GATT 特征以允许您读取信标标识符以便进行关联 - 但这对您没有帮助,直到 AFTER 您已经已连接,因此在确定要连接的设备时无用。 @davidyoung 非常感谢!我们将尝试使用 iBeacon 主要、次要领域,看看是否足够。 @davidyoung 关于您的替代方法,您的意思是如果我们定义我们的自定义 GATT 服务,我们可以用它宣传任何数据并且 iOS 不会在后台忽略它吗?以上是关于iOS 在后台模式下从广告中省略制造商数据的主要内容,如果未能解决你的问题,请参考以下文章