ios - iOS 在后台模式下从广告中省略制造商数据
问题描述
我在使用 BLE 与我们定制的 BLE 单元进行通信的 iOS 应用程序上工作。我们希望通过 BLE 自动向设备发送特定命令。
当用户靠近设备并满足特定条件时,应用程序应连接到设备,“登录”用户,通过 BLE 发送命令并立即断开连接。
这些特定标准基于来自广告的制造商数据(即,当制造商数据的最后一个字节为 0x01 时,设备处于“可登录”状态,当它为“不可登录”时,最后一个字节为 0x00)。
在前台,这种机制完美无缺。即使应用程序处于后台或终止(在 iPhone 上的仪表板中向上滑动),我们也希望这样做。
我们实现的机制:
- 该单元具有充当 iBeacon 的能力
- 当设备无法登录时,iBeacon 关闭
- 当它可用于登录时,iBeacon 将打开并唤醒应用程序,此时 BLE 扫描将以后台模式开始
- 背景模式设置为蓝牙中心
这里的问题是,无论我尝试了什么,广告:
- 有时它根本没有被发现(看起来像是时间问题?)
- 当它被发现时,它不包含制造商数据
有没有人遇到过类似的事情?任何帮助表示赞赏,祝您有美好的一天!
解决方案
应用程序在 iOS 后台时根本无法读取原始 BLE 制造商广告数据——操作系统禁止它。
此规则有两个例外:
iBeacon,它本身是作为一种特定类型的制造商广告来实现的。一个应用程序可以在 iOS 的后台检测 iBeacons,尽管只有四个字节的可读数据(编码在主要和次要字段中)是完全可用的。如果你可以修改你的设备以这种方式发送信息,它会做你想做的事。但是,您必须使用 CoreLocation API 来检测 iBeacon,因为 CoreBluetooth 不允许从 iBeacon 广告中读取制造商数据。如果您确实使用 CoreLocation,则无法使用检测与 CoreBluetooth 建立蓝牙连接,因为这两个 API 是沙盒化的。
溢出区域广告。后台 iOS 应用程序可以在后台读取这些特殊类型的制造商广告,但前提是屏幕打开。(通常可以通过发送本地通知在特定时间强制打开屏幕。)有关更多信息,请参阅我的博客文章:http ://www.davidgyoungtech.com/2020/05/07/hacking-the-overflow -区域
检测制造商广告的另一种方法是使用带有附加数据的 BLE 服务广告。为此,您需要定义一个 16 位或 128 位 GATT 服务 UUID 并发送带有附加数据字节的广告。 Eddystone 信标格式以这种方式工作,并允许在 iOS 上进行后台检测。如果您可以更改 BLE 硬件,这可能是最好的方法。
推荐阅读
- machine-learning - 如何将网络摄像头图像转换为 RGB 深度
- ios - swift / CoreData - 为数据模型创建“虚拟”NSManagedObjecID(无需托管对象即可测试事物)
- angular - 如何使用 Web SDK 执行基于 Fire 的电话身份验证?
- ios - 删除 UITextField 中的重复条目
- c# - 无法使用 Postman 从数据库获取数据,但 POST 工作正常
- angular - 焦点上的垫子输入不起作用Angular7
- python - 在python中如何替换稀疏csr_matrix中的nan
- sql - 如何使表列在插入期间始终使用默认值?
- javascript - 输入字段验证存在问题
- php - 为什么 stdClass 和匿名类在 assertEquals() 中的行为不同?