From f4a32bb7e883f97382f8d1fc81288a22058615ca Mon Sep 17 00:00:00 2001 From: km2023 Date: Wed, 6 May 2026 11:43:06 +0800 Subject: [PATCH] fix(ble): discover all services then filter; some firmware rejects scoped discovery When discoverServices is called with a specific UUID list, certain firmware returns an empty service array even though the requested service exists on the device. Match expo-duooomi-app's behavior (discoverAllServicesAndCharacteristics) by passing nil and filtering in the delegate callback. Also log discovered service UUIDs to aid future debugging. --- Sources/DuooomiBleSDK/Core/BleClient.swift | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/Sources/DuooomiBleSDK/Core/BleClient.swift b/Sources/DuooomiBleSDK/Core/BleClient.swift index 249620e..de5dffc 100644 --- a/Sources/DuooomiBleSDK/Core/BleClient.swift +++ b/Sources/DuooomiBleSDK/Core/BleClient.swift @@ -136,7 +136,9 @@ extension BleClient: CBCentralManagerDelegate { connectTimeoutWork = nil connectedPeripheral = peripheral peripheral.delegate = self - peripheral.discoverServices([BleUUIDs.service]) + // 发现全部 service(与 expo 端 discoverAllServicesAndCharacteristics 行为对齐)。 + // 某些固件传入指定 UUID 列表时返回空,需在 didDiscoverServices 自行过滤。 + peripheral.discoverServices(nil) } func centralManager(_ central: CBCentralManager, didFailToConnect peripheral: CBPeripheral, error: Error?) { @@ -177,7 +179,9 @@ extension BleClient: CBPeripheralDelegate { cb?(.failure(error)) return } - guard let service = peripheral.services?.first(where: { $0.uuid == BleUUIDs.service }) else { + let services = peripheral.services ?? [] + BleLog.d("Discovered \(services.count) service(s): \(services.map { $0.uuid.uuidString })", "BLE") + guard let service = services.first(where: { $0.uuid == BleUUIDs.service }) else { let cb = connectCompletion connectCompletion = nil cb?(.failure(DuooomiBleError.serviceNotFound))