[iOS] Scan - BleError: BluetoothLE is in unknown state
See original GitHub issuePrerequisites
- I am running the latest version
- I checked the documentation and found no answer
- I checked to make sure that this issue has not already been filed
Expected Behavior
When the BleState is PoweredOn, I should be able to startScanDevices() without having BleError: BluetoothLE is in unknown state.
I should be able to scan devices with and without “Remote Debug” enabled.
Current Behavior
When I start scanning my devices, I receive the BleError: BluetoothLE is in unknown state even if I waited that the BleManager State was in ‘PoweredOn’.
This behavior is only present when I enable the “Remote Debug” on iOS. It’s working fine if I’m disable the “Remote Debug”.
It’s really annoying because everybody is developing with the Remote Debug active I guess… Otherwise it’s a bit complicated.
I don’t see anything about this issue in the documentation. It’s just written that we have to wait that the status is PoweredOnon iOS. And that’s done…
I found that it’s not working with the “Remote Debug” active in this issue. I don’t understand why there is no related issue or documentation about that…
Steps to Reproduce
Please provide detailed steps for reproducing the issue.
- Run your app
- Activate Remote Debug
- Wait until State is
PoweredOn - Call
startDevicesScan() - See error…
Context
- Library version: 2.0.1
- Platform: iOS.
- JS logs:
DeviceScanner.js:17 LIB : Wait until bluetooth ready...
DeviceScanner.js:28 Base state PoweredOn
DeviceScanner.js:57 LIB : Start scan...
DeviceScanner.js:70 Scan error : {"message":"BluetoothLE is in unknown state","errorCode":103,"attErrorCode":null,"iosErrorCode":null,"androidErrorCode":null,"reason":null,"name":"BleError"}
DeviceScanner.js:85 LIB : Scan stopped
DeviceScanner.js:22 State change : PoweredOn
- Formatted code sample or link to a repository:
App.js
startScan() {
_deviceScanner.startDevicesScan(
error => {
console.error(error);
_deviceScanner.stopDevicesScan();
},
device => {
console.log(device);
}
);
};
DeviceScanner.js
/**
* Wait until Bluetooth is ready. On iOS the BLE stack is not immediately ready,
* we need to wait for the "PoweredOn" status.
*/
async waitUntilBluetoothReady() {
let {PoweredOn, PoweredOff, Unauthorized, Unsupported} = State;
console.log('LIB : Wait until bluetooth ready...');
return new Promise(async (resolve, reject) => {
this._bleManager.onStateChange(state => {
console.log('State changed : ', state);
if (state === PoweredOn) {
resolve(true);
}
});
// Verify if the state is already poweredOn before the listener was created
let crtState = await this._bleManager.state();
console.log('Base state', crtState);
if (crtState === PoweredOn) {
resolve(true);
}
else if (
crtState === PoweredOff ||
crtState === Unauthorized ||
crtState === Unsupported
) {
reject(new Error('Bluetooth is not available :', crtState));
}
});
}
/**
* Start device scanning only if the BleManager State is ready
*/
async startDevicesScan(
onError: (error: Error) => void,
onDeviceFound: (device: ConnectHubDevice) => void,
) {
this.waitUntilBluetoothReady()
.then(() => {
console.log('LIB : Start scan...');
const scanOptions = {
allowDuplicates: false,
scanMode: ScanMode.LowLatency,
};
this._bleManager.startDeviceScan(
[SERVICE_UUID],
scanOptions,
(error, device) => {
if (error) {
onError(error);
}
if (device) {
onDeviceFound(device);
}
},
);
})
.catch(error => console.log(JSON.stringify(error));
}
Issue Analytics
- State:
- Created 3 years ago
- Reactions:8
- Comments:15
Top Related StackOverflow Question
Is there any progress??
It is important to keep only a single instance of
BleManager. Readme was recently updated to stress this out.