iOS 17下无法检测特定BLE设备,peripheral.name返回nil求助
iOS 17 下 CBPeripheral.name 返回 nil 的解决方案
核心原因
iOS 17 调整了 BLE 设备名称的获取逻辑:扫描阶段直接访问 peripheral.name 会返回 nil,只有设备连接成功后该属性才会被正确赋值,这是苹果针对隐私与扫描效率优化的变更。
替代方案
1. 从广播数据中提取设备名称
扫描时通过 advertisementData 参数获取广播内的名称,可优先使用以下两个 Key:
CBAdvertisementDataCompleteLocalNameKey:设备的完整本地名称(广播包含时可用)CBAdvertisementDataLocalNameKey:设备的普通本地名称
示例代码:
func centralManager(_ central: CBCentralManager, didDiscover peripheral: CBPeripheral, advertisementData: [String : Any], rssi RSSI: NSNumber) { // 优先取完整名称,再降级取普通本地名称 let deviceName = advertisementData[CBAdvertisementDataCompleteLocalNameKey] as? String ?? advertisementData[CBAdvertisementDataLocalNameKey] as? String // 用提取到的名称做筛选逻辑 if let name = deviceName, name.contains("你的目标设备标识") { // 处理目标设备 } }
2. 连接后获取正式名称
如果业务必须依赖 peripheral.name,可先发起设备连接,在连接成功的代理方法中获取:
// 扫描到目标设备后发起连接 central.connect(peripheral) // 连接成功代理方法中获取名称 func centralManager(_ central: CBCentralManager, didConnect peripheral: CBPeripheral) { if let name = peripheral.name { // 此处可正常获取设备名称,执行后续筛选/展示逻辑 } }
注意事项
- 部分 BLE 设备不会在广播中携带名称,此类场景只能通过连接后获取名称
- 若设备广播的是短名称,连接后获取的
peripheral.name会是完整的设备名称
内容的提问来源于stack exchange,提问作者trimaximus
相关产品推荐
相关产品推荐

