iOS无前台预交互时无法后台扫描连接BLE设备问题咨询
iOS后台首次通过UUID扫描连接BLE设备方案
可以实现首次后台通过服务UUID扫描并连接BLE设备,你遇到的报错核心是后台扫描规则不符合iOS系统限制导致设备未被发现。
失效场景根因
- iOS后台扫描BLE设备时不支持全量扫描,必须明确指定要扫描的服务UUID列表,且对应外设必须在广播包(ADV_IND)的「主服务UUID字段」中携带该UUID,仅放在扫描响应(Scan Response)里的UUID后台无法识别。前台扫描可以识别扫描响应中的UUID,因此你首次前台交互后后台连接正常;但未经过前台交互、完全后台扫描时,系统无法识别扫描响应里的UUID,找不到设备就会抛出:
last peripheral not found
- 已经在前台发现过的外设,系统会缓存外设的UUID和标识,后台可以直接通过缓存的标识调用
connect(_:options:)连接,不需要重新扫描,这就是你首次前台交互后后台连接正常的原因。
首次后台扫描连接的配置要求
1. 权限与后台模式配置
- 项目Info.plist必须添加
NSBluetoothAlwaysUsageDescription权限描述,不能仅使用iOS12及以前的旧权限NSBluetoothPeripheralUsageDescription - 项目Signing & Capabilities中开启「Background Modes」,勾选「Uses Bluetooth LE accessories」选项
2. 扫描代码配置
- 调用
scanForPeripherals(withServices:options:)时,withServices参数必须传入你要匹配的服务UUID数组,不能传nil - 扫描选项中
CBCentralManagerScanOptionAllowDuplicatesKey必须设为false,iOS后台会强制忽略该参数为true的配置,传true反而会导致扫描回调被合并甚至不触发 - 要支持App被杀死后仍能被系统唤醒执行扫描连接,初始化
CBCentralManager时必须传入CBCentralManagerOptionRestoreIdentifierKey参数,配置唯一的恢复标识,才能在唤醒后恢复之前的扫描和连接任务
3. 外设广播配置要求
外设必须把你扫描用的服务UUID放在广播包的Service UUIDs字段中,不能仅放在扫描响应里,需要和硬件开发侧确认该配置符合要求。
内容的提问来源于stack exchange,提问作者Developer1205
相关产品推荐
相关产品推荐

