dotintent / react-native-ble-plx

React Native BLE library
Apache License 2.0
3.05k stars 513 forks source link

Issue with [BleError: Operation was cancelled] on iOS 17 #1230

Open HwangJungeon opened 2 months ago

HwangJungeon commented 2 months ago

Prerequisites

Question

Hello,

I am encountering an issue with the [BleError: Operation was cancelled] error on iOS 17. This problem does not occur when testing on AOS, but it started appearing on iOS after a period of smooth operation. The issue persists consistently.

I have reviewed and attempted solutions suggested in previous issues, such as Connection Error 2 "Operation was cancelled" on IOS16 #1080. I tried using device.cancelConnection() before device.connect() and modified my code to ensure that new BleManager() is called only once by implementing a singleton pattern. Despite these efforts, the problem remains unresolved.

The most perplexing aspect is that the connection works fine on iOS initially, but the error reappears the next day upon retrying.

Additionally, I have verified iOS permissions, cleaned the iOS build folder, and retried the process. I am currently using the latest version of react-native-ble-plx (3.2.1).

Environment:

Any assistance or insights into resolving this issue would be greatly appreciated.

Thank you.

Question related code

No response

shanez commented 1 month ago

@HwangJungeon What iOS minor version are you on?

HwangJungeon commented 1 month ago

@HwangJungeon What iOS minor version are you on? @shanez I used iOS version 17.5.1 (21F90)

ebadia commented 1 month ago

Same here using 3.2.1 on:

Tried several "connect/disconnect" combinations all with the same result: 'ERROR', [BleError: Operation was cancelled]

Help appreciated too. Thanks!!!

HwangJungeon commented 1 month ago

@ebadia In my case, I tried reinstalling the node module, which helped a bit, but still intermittently throwing the error 'ERROR', [BleError: Operation was canceled]

ebadia commented 1 month ago

@ebadia In my case, I tried reinstalling the node module, which helped a bit, but still intermittently throwing the error 'ERROR', [BleError: Operation was canceled]

I deleted node_modules folder, install them again, but the error persists. Thanks for your response!

HwangJungeon commented 1 month ago

@ebadia In my case, I tried reinstalling the node module, which helped a bit, but still intermittently throwing the error 'ERROR', [BleError: Operation was canceled]

I deleted node_modules folder, install them again, but the error persists. Thanks for your response!

It still happens to me too... I'll continue to try different things to fix the error, and if I find a good solution, I'll share it!

ebadia commented 1 month ago

@ebadia In my case, I tried reinstalling the node module, which helped a bit, but still intermittently throwing the error 'ERROR', [BleError: Operation was canceled]

I deleted node_modules folder, install them again, but the error persists. Thanks for your response!

It still happens to me too... I'll continue to try different things to fix the error, and if I find a good solution, I'll share it!

Thanks, I will do the same

intent-kacper-cyranowski commented 1 month ago

Hi @HwangJungeon @ebadia Could you provide repro of your issue and collect logs?

ebadia commented 1 month ago

This is the code I use to identify and connect to the BLE device (a weight scale)

            if (device.name === "Chipsea-BLE") {
              console.log("IDENTIFICADOR", device.name);
              console.log("IM CONNECTED", await device.isConnected());

              ble.stopDeviceScan();
              if (!await device.isConnected()) {
                try {
                  await device.connect();

                  console.log("CONNECTED", device.id);

                } catch (e) {
                  console.log("ERROR CONN", e);
                }
              }

This is the log from this piece of code:

[RxBLEKit|VERB|12:05:52.175]: CentralManager(10763401600) didDiscover(peripheral: Peripheral(uuid: 1ECEA624-9BC7-60C4-74B4-E09FA61E3456, name: Optional("Chipsea-BLE")),
rssi: -60)
2024-08-30 13:05:52.176105+0100 pronokalPre[38603:3770084] [javascript] 'IDENTIFICADOR', 'Chipsea-BLE'
2024-08-30 13:05:52.178016+0100 pronokalPre[38603:3770084] [javascript] 'IDENTIFICADOR', 'Chipsea-BLE'
[RxBLEKit|VERB|12:05:52.178]: CentralManager(10763401600) didDiscover(peripheral: Peripheral(uuid: 3E3349C0-05D8-8F5C-E6CF-9DA14F1D790C, name: nil),
rssi: -73)
2024-08-30 13:05:52.179856+0100 pronokalPre[38603:3770084] [javascript] 'IM CONNECTED', false
[RxBLEKit|VERB|12:05:52.180]: CentralManager(10763401600) didDiscover(peripheral: Peripheral(uuid: 3E3349C0-05D8-8F5C-E6CF-9DA14F1D790C, name: nil),
rssi: -73)
[RxBLEKit|DEBG|12:05:52.182]: CentralManager(10763401600) stopScan()
2024-08-30 13:05:52.183974+0100 pronokalPre[38603:3770084] [javascript] 'IM CONNECTED', false
[RxBLEKit|DEBG|12:05:52.186]: CentralManager(10763401600) retrievePeripherals(
withIdentifiers: [1ECEA624-9BC7-60C4-74B4-E09FA61E3456])
[RxBLEKit|DEBG|12:05:52.190]: CentralManager(10763401600) connect(
peripheral: Peripheral(uuid: 1ECEA624-9BC7-60C4-74B4-E09FA61E3456, name: Optional("Chipsea-BLE")),
options: nil)
[RxBLEKit|DEBG|12:05:52.191]: CentralManager(10763401600) retrievePeripherals(
withIdentifiers: [1ECEA624-9BC7-60C4-74B4-E09FA61E3456])
[RxBLEKit|DEBG|12:05:52.191]: CentralManager(10763401600) connect(
peripheral: Peripheral(uuid: 1ECEA624-9BC7-60C4-74B4-E09FA61E3456, name: Optional("Chipsea-BLE")),
options: nil)
[RxBLEKit|DEBG|12:05:52.192]: CentralManager(10763401600) cancelPeripheralConnection(
peripheral: Peripheral(uuid: 1ECEA624-9BC7-60C4-74B4-E09FA61E3456, name: Optional("Chipsea-BLE")))
[RxBLEKit|DEBG|12:05:52.226]: CentralManager(10763401600) didDisconnect(from: Peripheral(uuid: 1ECEA624-9BC7-60C4-74B4-E09FA61E3456, name: Optional("Chipsea-BLE")),
error: nil)
2024-08-30 13:05:52.229912+0100 pronokalPre[38603:3770084] [javascript] 'ERROR CONN', [BleError: Operation was cancelled]
[RxBLEKit|DEBG|12:06:05.973]: CentralManager(10763401600) cancelPeripheralConnection(
peripheral: Peripheral(uuid: 1ECEA624-9BC7-60C4-74B4-E09FA61E3456, name: Optional("Chipsea-BLE")))
2024-08-30 13:06:06.010458+0100 pronokalPre[38603:3770081] [CoreBluetooth] XPC connection invalid

Hope it helps you!

HwangJungeon commented 1 month ago

@intent-kacper-cyranowski

I apologize for the delayed response to your comment. As the issue persists, I've attempted the following approach, which seems to work without any problems:

if (error instanceof Error && error.message.includes('Operation was cancelled')) {
    this.manager.destroy();
    this.manager = new BleManager();
    return this.connectToDevice(deviceId);
}

This method catches the "Operation was cancelled" error, destroys the existing instance, creates a new one, and then attempts to reconnect to the device.

Do you think this approach is acceptable to use?

ebadia commented 1 month ago

@intent-kacper-cyranowski

I apologize for the delayed response to your comment. As the issue persists, I've attempted the following approach, which seems to work without any problems:

if (error instanceof Error && error.message.includes('Operation was cancelled')) {
    this.manager.destroy();
    this.manager = new BleManager();
    return this.connectToDevice(deviceId);
}

This method catches the "Operation was cancelled" error, destroys the existing instance, creates a new one, and then attempts to reconnect to the device.

Do you think this approach is acceptable to use?

Still have issues, will continue trying different approaches. Thanks!

zachTrio commented 2 days ago

@intent-kacper-cyranowski I apologize for the delayed response to your comment. As the issue persists, I've attempted the following approach, which seems to work without any problems:

if (error instanceof Error && error.message.includes('Operation was cancelled')) {
    this.manager.destroy();
    this.manager = new BleManager();
    return this.connectToDevice(deviceId);
}

This method catches the "Operation was cancelled" error, destroys the existing instance, creates a new one, and then attempts to reconnect to the device. Do you think this approach is acceptable to use?

Still have issues, will continue trying different approaches. Thanks!

Have you settled on a new approach? Running into the same error.

HwangJungeon commented 1 day ago

@zachTrio The method I showed is simple, but still works well. I'm still using it and it's working fine on iOS 18.

zachTrio commented 1 day ago

@HwangJungeon I'll give it a go.

Though, I feel like I was trying to still track down where this error was throwing when I commented on this issue.

The stack trace was fairly useless from what I remember and I think just about everything can throw the 'Operation was cancelled'

What function/s are you catching here.