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:
committed by
Foti Dim
parent
7228b554f9
commit
e8b8e0fd71
@@ -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) {
|
||||||
|
|||||||
Reference in New Issue
Block a user