From 87fbbf33f985d6b41c3c93bfb92414a25bbb6f5f Mon Sep 17 00:00:00 2001 From: ByteZhang Date: Tue, 9 Jun 2026 21:19:42 +0800 Subject: [PATCH 1/2] fix: lazy CBCentralManager init to avoid iOS BT prompt at app launch Previously the manager was allocated in init(), which RN's bridge calls the first time JS touches NativeModules.BleUtilsModule. That allocation triggered the iOS "Turn on Bluetooth" system dialog on every app launch when BT was off, even if the user never entered a hardware flow. Allocate lazily via ensureManager() on first checkState/getConnectedPeripherals call instead. --- ios/BleUtils.swift | 24 +++++++++++++++--------- 1 file changed, 15 insertions(+), 9 deletions(-) diff --git a/ios/BleUtils.swift b/ios/BleUtils.swift index 1dd806a..06267c8 100644 --- a/ios/BleUtils.swift +++ b/ios/BleUtils.swift @@ -14,7 +14,14 @@ class BleUtilsModule: NSObject, CBCentralManagerDelegate, CBPeripheralDelegate { override init() { super.init() - manager = CBCentralManager(delegate: self, queue: nil) + // Lazy CBCentralManager: avoid triggering iOS BT dialog on module init. + } + + private func ensureManager() -> CBCentralManager { + if let m = manager { return m } + let m = CBCentralManager(delegate: self, queue: nil) + manager = m + return m } func centralManagerDidUpdateState(_ central: CBCentralManager) { @@ -28,13 +35,12 @@ class BleUtilsModule: NSObject, CBCentralManagerDelegate, CBPeripheralDelegate { } @objc public func checkState(_ callback: @escaping RCTResponseSenderBlock) { - if let manager = manager { - if manager.state == .unknown { - stateChangedCallbacks.append(callback) - } else { - let stateName = Helper.centralManagerStateToString(manager.state) - callback([stateName]) - } + let manager = ensureManager() + if manager.state == .unknown { + stateChangedCallbacks.append(callback) + } else { + let stateName = Helper.centralManagerStateToString(manager.state) + callback([stateName]) } } @@ -49,7 +55,7 @@ class BleUtilsModule: NSObject, CBCentralManagerDelegate, CBPeripheralDelegate { var connectedPeripherals: [Peripheral] = [] - let connectedCBPeripherals: [CBPeripheral] = manager?.retrieveConnectedPeripherals(withServices: serviceUUIDs) ?? [] + let connectedCBPeripherals: [CBPeripheral] = ensureManager().retrieveConnectedPeripherals(withServices: serviceUUIDs) serialQueue.sync { for ph in connectedCBPeripherals { From d566d2154e12295a1511531b26925bccfda885f2 Mon Sep 17 00:00:00 2001 From: ByteZhang Date: Tue, 9 Jun 2026 21:20:18 +0800 Subject: [PATCH 2/2] chore: bump version to 0.1.5 --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 16d21b9..378a84e 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@onekeyfe/react-native-ble-utils", - "version": "0.1.4", + "version": "0.1.5", "description": "ble uilts", "source": "./src/index.tsx", "main": "./dist/commonjs/index.js",