Add service-data in advertisements (#207)

* Add service-data in advertisements

* Fix windows serviceData parsing

* Resolve Ai comments

* Resolve Ai comments and validate service data

* Cleanup and Update changelog
This commit is contained in:
Rohit Sangwan
2026-01-21 13:43:36 +05:30
committed by GitHub
parent 1334057a8a
commit dae2f5dc4d
18 changed files with 268 additions and 37 deletions
+6 -2
View File
@@ -213,6 +213,7 @@ struct UniversalBleScanResult: Hashable {
var isPaired: Bool? = nil
var rssi: Int64? = nil
var manufacturerDataList: [UniversalManufacturerData]? = nil
var serviceData: [String: FlutterStandardTypedData]? = nil
var services: [String]? = nil
var timestamp: Int64? = nil
@@ -224,8 +225,9 @@ struct UniversalBleScanResult: Hashable {
let isPaired: Bool? = nilOrValue(pigeonVar_list[2])
let rssi: Int64? = nilOrValue(pigeonVar_list[3])
let manufacturerDataList: [UniversalManufacturerData]? = nilOrValue(pigeonVar_list[4])
let services: [String]? = nilOrValue(pigeonVar_list[5])
let timestamp: Int64? = nilOrValue(pigeonVar_list[6])
let serviceData: [String: FlutterStandardTypedData]? = nilOrValue(pigeonVar_list[5])
let services: [String]? = nilOrValue(pigeonVar_list[6])
let timestamp: Int64? = nilOrValue(pigeonVar_list[7])
return UniversalBleScanResult(
deviceId: deviceId,
@@ -233,6 +235,7 @@ struct UniversalBleScanResult: Hashable {
isPaired: isPaired,
rssi: rssi,
manufacturerDataList: manufacturerDataList,
serviceData: serviceData,
services: services,
timestamp: timestamp
)
@@ -244,6 +247,7 @@ struct UniversalBleScanResult: Hashable {
isPaired,
rssi,
manufacturerDataList,
serviceData,
services,
timestamp,
]
+17 -7
View File
@@ -134,7 +134,7 @@ private class BleCentralDarwin: NSObject, UniversalBlePlatformChannel, CBCentral
let peripheral = try deviceId.getPeripheral(manager: manager)
peripheral.delegate = self
let shouldAutoConnect = autoConnect ?? false
if shouldAutoConnect {
autoConnectDevices.insert(deviceId)
if #available(iOS 17.0, macOS 14.0, watchOS 10.0, tvOS 17.0, *) {
@@ -148,9 +148,9 @@ private class BleCentralDarwin: NSObject, UniversalBlePlatformChannel, CBCentral
// (e.g., in central manager delegate callbacks).
UniversalBleLogger.shared.logInfo(
"autoConnect requested for device \(deviceId), " +
"but automatic reconnection via CBConnectPeripheralOptionEnableAutoReconnect " +
"is only available on iOS 17+/macOS 14+/watchOS 10+/tvOS 17+. " +
"On this OS version, reconnections must be handled manually."
"but automatic reconnection via CBConnectPeripheralOptionEnableAutoReconnect " +
"is only available on iOS 17+/macOS 14+/watchOS 10+/tvOS 17+. " +
"On this OS version, reconnections must be handled manually."
)
manager.connect(peripheral)
}
@@ -410,6 +410,7 @@ private class BleCentralDarwin: NSObject, UniversalBlePlatformChannel, CBCentral
return UniversalBleScanResult(
deviceId: id,
name: name,
serviceData: nil,
timestamp: Int64(Date().timeIntervalSince1970 * 1000)
)
}))
@@ -437,6 +438,7 @@ private class BleCentralDarwin: NSObject, UniversalBlePlatformChannel, CBCentral
// Extract manufacturer data and service UUIDs from the advertisement data
let manufacturerData = advertisementData[CBAdvertisementDataManufacturerDataKey] as? Data
let services = (advertisementData[CBAdvertisementDataServiceUUIDsKey] as? [CBUUID])
let serviceDataDict = advertisementData[CBAdvertisementDataServiceDataKey] as? [CBUUID: Data]
var manufacturerDataList: [UniversalManufacturerData] = []
var universalManufacturerData: UniversalManufacturerData? = nil
@@ -448,6 +450,13 @@ private class BleCentralDarwin: NSObject, UniversalBlePlatformChannel, CBCentral
manufacturerDataList.append(universalManufacturerData!)
}
var serviceData: [String: FlutterStandardTypedData]? = nil
if let serviceDataDict = serviceDataDict {
serviceData = Dictionary(uniqueKeysWithValues: serviceDataDict.map { uuid, data in
(uuid.uuidStr, FlutterStandardTypedData(bytes: data))
})
}
let advertisedName = advertisementData[CBAdvertisementDataLocalNameKey] as? String
let displayName = advertisedName ?? peripheral.name
advertisementNameCache[peripheral.uuid.uuidString] = displayName
@@ -463,6 +472,7 @@ private class BleCentralDarwin: NSObject, UniversalBlePlatformChannel, CBCentral
isPaired: nil,
rssi: RSSI as? Int64,
manufacturerDataList: manufacturerDataList,
serviceData: serviceData,
services: services?.map { $0.uuidStr },
timestamp: Int64(Date().timeIntervalSince1970 * 1000)
)) { _ in }
@@ -481,18 +491,18 @@ private class BleCentralDarwin: NSObject, UniversalBlePlatformChannel, CBCentral
public func centralManager(
_: CBCentralManager,
didDisconnectPeripheral peripheral: CBPeripheral,
timestamp: CFAbsoluteTime,
timestamp _: CFAbsoluteTime,
isReconnecting: Bool,
error: Error?
) {
let deviceId = peripheral.uuid.uuidString
if #available(iOS 17.0, macOS 14.0, watchOS 10.0, tvOS 17.0, *) {
if isReconnecting {
return
}
}
handlePeripheralDisconnection(deviceId: deviceId, error: error)
}