问题描述
有一个要求,当应用程序被用户或操作系统杀死时,我需要允许 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 操作将在该外设上执行(即建立连接、将数据发送到特定特性,最后断开连接)。这在前台模式下效果很好。
现在,我需要在后台实现相同的机制(即应用程序未运行状态)。我怎样才能实现它?
注意:
解决方法
iOS 将在检测到信标后启动您的应用,您将收到 didEnter(region:)
回调。此时,您可以立即使用 locationManager.startRangingBeacons(...)
启动信标测距,您将收到 didRangeBeacons(...)
几秒钟的回调——足够读取主要/次要标识符并完成您需要的工作。>