darwin: Cache and return advertised name for system devices

iOS and MacOS don't remember the advertised name for system devices, so we do that
This commit is contained in:
Jonas Greifenhain
2025-05-27 19:13:36 +02:00
committed by Foti Dim
parent 7228b554f9
commit e8b8e0fd71
+13 -6
View File
@@ -24,6 +24,10 @@ public class UniversalBlePlugin: NSObject, FlutterPlugin {
private var discoveredPeripherals = [String: CBPeripheral]() private var discoveredPeripherals = [String: CBPeripheral]()
// Cache last advertised local name for peripherals
// since iOS and MacOS don't do that for system devices
private var advertisementNameCache = [String: String]()
private class BleCentralDarwin: NSObject, UniversalBlePlatformChannel, CBCentralManagerDelegate, CBPeripheralDelegate { private class BleCentralDarwin: NSObject, UniversalBlePlatformChannel, CBCentralManagerDelegate, CBPeripheralDelegate {
var callbackChannel: UniversalBleCallbackChannel var callbackChannel: UniversalBleCallbackChannel
private var universalBleFilterUtil = UniversalBleFilterUtil() private var universalBleFilterUtil = UniversalBleFilterUtil()
@@ -294,17 +298,19 @@ private class BleCentralDarwin: NSObject, UniversalBlePlatformChannel, CBCentral
var servicesFilter = withServices var servicesFilter = withServices
if servicesFilter.isEmpty { if servicesFilter.isEmpty {
print("No services filter was set for getting system connected devices. Using default services...") print("No services filter was set for getting system connected devices. Using default services...")
// Add several generic services // Add several generic services
servicesFilter = ["1800", "1801", "180A", "180D", "1810", "181B", "1808", "181D", "1816", "1814", "181A", "1802", "1803", "1804", "1815", "1805", "1807", "1806", "1848", "185E", "180F", "1812", "180E", "1813"] servicesFilter = ["1800", "1801", "180A", "180D", "1810", "181B", "1808", "181D", "1816", "1814", "181A", "1802", "1803", "1804", "1815", "1805", "1807", "1806", "1848", "185E", "180F", "1812", "180E", "1813"]
} }
var filterCBUUID = servicesFilter.map { CBUUID(string: $0) } let filterCBUUID = servicesFilter.map { CBUUID(string: $0) }
let bleDevices = manager.retrieveConnectedPeripherals(withServices: filterCBUUID) let bleDevices = manager.retrieveConnectedPeripherals(withServices: filterCBUUID)
bleDevices.forEach { $0.saveCache() } bleDevices.forEach { $0.saveCache() }
completion(Result.success(bleDevices.map { completion(Result.success(bleDevices.map { peripheral in
UniversalBleScanResult( let id = peripheral.uuid.uuidString
deviceId: $0.uuid.uuidString, let name = advertisementNameCache[id] ?? discoveredPeripherals[id]?.name ?? peripheral.name ?? ""
name: $0.name ?? "" return UniversalBleScanResult(
deviceId: id,
name: name
) )
})) }))
} }
@@ -339,6 +345,7 @@ private class BleCentralDarwin: NSObject, UniversalBlePlatformChannel, CBCentral
let advertisedName = advertisementData[CBAdvertisementDataLocalNameKey] as? String let advertisedName = advertisementData[CBAdvertisementDataLocalNameKey] as? String
let displayName = advertisedName ?? peripheral.name let displayName = advertisedName ?? peripheral.name
advertisementNameCache[peripheral.uuid.uuidString] = displayName
// Apply custom filters and return early if the peripheral doesn't match // Apply custom filters and return early if the peripheral doesn't match
if !universalBleFilterUtil.filterDevice(name: displayName, manufacturerData: universalManufacturerData, services: services) { if !universalBleFilterUtil.filterDevice(name: displayName, manufacturerData: universalManufacturerData, services: services) {