From 3d699a083f2ce93360afdc4304003cdb66b3f493 Mon Sep 17 00:00:00 2001 From: Matej Glejtek Date: Wed, 6 Aug 2025 17:23:46 +0200 Subject: [PATCH] fix(ios): wait until CBCentralmanager inits if its state is unknown DT-4144 --- ios/Classes/Scanner/BluetoothScanner.swift | 17 +++++++++++++++-- ios/Classes/SwiftFlutterOpendroneidPlugin.swift | 2 +- 2 files changed, 16 insertions(+), 3 deletions(-) diff --git a/ios/Classes/Scanner/BluetoothScanner.swift b/ios/Classes/Scanner/BluetoothScanner.swift index b42aef7..d1aed95 100644 --- a/ios/Classes/Scanner/BluetoothScanner.swift +++ b/ios/Classes/Scanner/BluetoothScanner.swift @@ -12,6 +12,8 @@ class BluetoothScanner: NSObject, CBCentralManagerDelegate, DTGPayloadApi { private var restartTimer: Timer?; private let restartIntervalSec: TimeInterval = 120.0 private var shortServiceUuid: String? = nil + private var managerStateContinuation: CheckedContinuation? + let dispatchQueue: DispatchQueue = DispatchQueue(label: "BluetoothScanner") private var serviceUUID: CBUUID { @@ -78,11 +80,22 @@ class BluetoothScanner: NSObject, CBCentralManagerDelegate, DTGPayloadApi { scanStateHandler.send(centralManager.isScanning) } - func managerState() -> Int{ - return centralManager.state.rawValue + func managerState() async -> Int { + if centralManager.state != .unknown { + return centralManager.state.rawValue + } + + // If state is .unknown, wait for update of CBCentralManager state + return await withCheckedContinuation { continuation in + self.managerStateContinuation = continuation + } } func centralManagerDidUpdateState(_ central: CBCentralManager) { + if let continuation = managerStateContinuation { + managerStateContinuation = nil + continuation.resume(returning: central.state.rawValue) + } updateScanState() } diff --git a/ios/Classes/SwiftFlutterOpendroneidPlugin.swift b/ios/Classes/SwiftFlutterOpendroneidPlugin.swift index 38e0af3..e81fdf2 100644 --- a/ios/Classes/SwiftFlutterOpendroneidPlugin.swift +++ b/ios/Classes/SwiftFlutterOpendroneidPlugin.swift @@ -126,7 +126,7 @@ public class SwiftFlutterOpendroneidPlugin: NSObject, FlutterPlugin, DTGApi{ guard let scanner = bluetoothScanner else { return (nil, PluginNotInitializedException()) } - return ((scanner.managerState()) as NSNumber?, nil) + return ((await scanner.managerState()) as NSNumber?, nil) } public func wifiState() async -> (NSNumber?, FlutterError?) {