在不配对的情况下为 iOS 附加广告负载

Attaching advertising payload for iOS without pairing

有人知道如何在 iOS 上通过 BLE 传输短字符串或字节数组而无需配对吗?

根据我的研究,startAdvertise 方法允许的唯一 2 个键是 CBAdvertisementDataLocalNameKeyCBAdvertisementDataServiceUUIDsKey

https://developer.apple.com/documentation/corebluetooth/cbperipheralmanager/1393252-startadvertising

我还以为我可以用

CBAdvertisementDataServiceDataKey: String
A dictionary that contains service-specific advertisement data.

附加数据,但这似乎是另一个死胡同 WARNING: The advertisement key 'Service Data' is not allowed?

遗憾的是,您不能使用 CoreBluetooth API 将数据附加到广告。在 iOS 上,CBAdvertisementDataServiceDataKey 是只读的。虽然蓝牙 LE 允许附加服务数据,但 Apple 实际上禁止第 3 方应用程序执行此操作。

您有几个选择:

  1. 在 128 位服务 UUID 中对您的数据进行编码并宣传它。您需要在 UUID 中保留一两个字节才能知道它是 "your" 广告,因此可以从其他字节解码数据。只有当您的应用程序位于屏幕上可见的前台时,才会公布此完整的 UUID。让它进入后台或屏幕关闭,它就不会再以那种形式投放广告。同样,接收iOS台设备也必须在前台亮屏。这是因为 iOS 不允许在不预先指定匹配服务 UUID 的情况下获取后台扫描结果。而且因为您正在动态地操作其中一些字节,所以您不知道它会是什么。

  2. 使用 CoreLocation 对 iBeacon BLE 广告中的 4 字节主要字段和次要字段进行类似的 编码。同样,这允许您仅在应用程序位于前台时传输。然而,接收可能会在后台发生有限的程度(当结合监控和测距 API 时,您的一个信标首次出现后 5-10 秒。)最大的缺点是您只有四个字节可以使用。

  3. 通过操纵128位背景BLE溢出区域广告来广告数据。这种技术更先进,但广告在后台运行。接收在前台工作,部分在后台工作——如果屏幕至少打开,您就可以接收。您可以在我的博客 post 此处 http://www.davidgyoungtech.com/2020/05/07/hacking-the-overflow-area.

  4. 中阅读有关此技术的更多信息并访问免费示例代码