CoreBluetooth在iPhone与Mac上的差异:制造商数据丢失问题
CoreBluetooth在iPhone上无法获取BLE广播的制造商数据(Mac正常)
我使用CoreBluetooth监听BLE设备的广播数据,以提取所需的制造商数据字节。代码在搭载硅芯片的Mac上运行正常,能获取预期数据;但在iPhone上运行完全相同的代码时,CBAdvertisementDataManufacturerDataKey对应的键完全不存在,制造商数据缺失。其他应用(如nRF Connect)可正常提取该数据。
相关代码片段
centralManager.scanForPeripherals(withServices: nil, options: [CBCentralManagerScanOptionAllowDuplicatesKey: true]) ... if let manufacturerData = fullAdvertisementData[CBAdvertisementDataManufacturerDataKey] as? Data { ... // iPhone上不会进入这里,因为数据不存在 }
可能的解决方向
检查蓝牙权限配置
iPhone对蓝牙权限的管控比Mac更严格:- 在
Info.plist中添加NSBluetoothAlwaysUsageDescription(iOS 13+推荐)或NSBluetoothPeripheralUsageDescription,填写明确的权限申请说明。 - 进入iPhone「设置-隐私与安全性-蓝牙」,确认应用已开启蓝牙权限。
- 在
排查广播包长度限制
BLE广播包总长度通常限制为31字节,iPhone可能会截断超出长度的广播数据,而Mac的处理逻辑更宽松。通过nRF Connect查看广播包总长度,若接近或超过31字节,需调整BLE设备的广播内容,精简非必要数据。尝试定向扫描服务UUID
iPhone的CoreBluetooth对无过滤的全量扫描可能存在特殊处理逻辑,尝试指定目标设备的服务UUID进行扫描:let targetServiceUUID = CBUUID(string: "你的设备服务UUID") centralManager.scanForPeripherals(withServices: [targetServiceUUID], options: [CBCentralManagerScanOptionAllowDuplicatesKey: true])检查iOS版本差异
不同iOS版本的CoreBluetooth对广播数据的解析逻辑可能存在差异,尝试将iPhone升级至最新iOS版本后重新测试。打印完整广播数据排查
在iPhone上打印fullAdvertisementData的所有键值对,确认制造商数据是否被解析到其他字段中:print("完整广播数据: \(fullAdvertisementData)")
内容的提问来源于stack exchange,提问作者Owen
相关产品推荐
相关产品推荐

