getconnectedbluetoothdevices 返回设备无 name 是因 ble 协议仅在广播阶段发送名称,连接后广播停止;ios 出于隐私禁止暴露已连设备名,android 的 name 仅为扫描快照且不可靠。

不能直接获取已连接设备的名称,必须靠缓存或广播数据提前记录。uni-app 的 uni.getConnectedBluetoothDevices 在 iOS 上返回的设备对象里不含 name 字段(Android 虽有但不可靠),且蓝牙协议本身不保证连接后还能读取设备名。
为什么 getConnectedBluetoothDevices 返回的设备没有 name?
iOS 系统限制:出于隐私策略,系统不向 App 暴露已连接设备的名称,uni.getConnectedBluetoothDevices 返回的设备列表中 name 为空或为 undefined;Android 虽可能返回 name,但该字段来自扫描阶段的广播包,连接后设备可能改名或广播停发,不可作为唯一依据。
根本原因在于:BLE 设备名称属于广播数据(Advertising Data),只在未连接/可被发现状态下主动发出;一旦建立连接,广播停止,名称信息即丢失。
实际可行的两种方案
方案一:在扫描阶段缓存设备名(推荐)
- 监听
uni.onBluetoothDeviceFound,把扫描到的每个device.deviceId对应的device.name存进本地 Map 或 Vuex / Pinia 中 - 连接成功后,用
deviceId查表获取当时记录的名称 - 注意:iOS 的
deviceId是动态 UUID,每次重启蓝牙会变,所以需配合广播中的稳定标识(如 manufacturerData 或 localName 字段)做二次匹配
方案二:连接后主动读取设备的 Device Name Characteristic(需硬件支持)
- 标准 BLE 服务
0000180a-0000-1000-8000-00805f9b34fb(Generic Access)下有特征值00002a00-0000-1000-8000-00805f9b34fb(Device Name) - 需先调用
uni.getConnectedBluetoothDevices获取 deviceId →uni.createBLEConnection→uni.getBLEDeviceServices→uni.getBLEDeviceCharacteristics→uni.readBLECharacteristicValue - 但大量低成本传感器/手环并不实现该服务,读取会失败(
errCode: 10008)
Android 和 iOS 的关键差异点
Android 下 uni.getConnectedBluetoothDevices 返回的设备对象中 name 字段偶尔存在,但:
- 它只是上次扫描时的快照,设备重命名后不会更新
- 部分厂商 ROM(如华为 EMUI)会强制清空该字段以节省资源
- 不能用于 UI 显示“当前连接设备名”的准确来源
iOS 下该字段始终为空,且 getConnectedBluetoothDevices 必须传 services 数组(至少含主 serviceUUID),否则返回空列表 —— 这意味着你得先知道设备的服务 ID 才能查到它,进一步削弱了“反向查名称”的可行性。
最稳的做法是:扫描时存名 + 连接时校验广播数据中的固定字段(比如设备型号前缀、manufacturerData 特定位),而不是依赖连接后的实时查询。











