需要帮助集成“iBeacon + BLE 外围扫描 iOS 后台模式”功能

问题描述

一个要求,当应用程序被用户或操作系统杀死时,我需要允许 iOS 应用程序与 BLE 硬件通信(可能或可能不强制)。

该硬件同时用作 iBeacon 和 BLE 外设!

我们所做的是:

  • 应用首次启动 --> 然后请求 AlwaysUsage 权限
  • 仅使用 UUID(uuidString: "{Provided UUID}") 开始扫描 iBeacon 区域(次要值会有所不同)
  • 当收到 func locationManager(_ manager: CLLocationManager,didRangeBeacons beacons: [CLBeacon],in the region: CLBeaconRegion) 回调时,我们正在从检测到的信标中提取主要和次要值,并根据此值准备一个服务 UUID 字符串,例如如果主要值是:00 和次要值是“11”,则将其合并为“0011”并将此最终合并值添加为设备服务 UUID 的前缀,例如“0011-12345-12345-123452”开始扫描BLE外设。

所以我的 BLECentralManager 对象将开始扫描

self?.bleCentralManager.scanForperipherals(withServices: "0011-12345-12345-123452",options: [CBCentralManagerScanoptionAllowDuplicatesKey: false])

一旦检测到外设,其余的 BLE 操作将在该外设上执行(即建立连接、将数据发送到特定特性,最后断开连接)。这在前台模式下效果很好。

现在,我需要在后台实现相同的机制(即应用程序未运行状态)。我怎样才能实现它?

注意:

  • 对 iBeacon 区域的监控从未停止。因此,即使我的应用未启动,我也能唤醒它。
  • 但我的问题是,如何开始为后台检测到的 Beacon 准备 Major + Minor 值字符串

解决方法

iOS 将在检测到信标后启动您的应用,您将收到 didEnter(region:) 回调。此时,您可以立即使用 locationManager.startRangingBeacons(...) 启动信标测距,您将收到 didRangeBeacons(...) 几秒钟的回调——足够读取主要/次要标识符并完成您需要的工作。>