Я использую библиотеку react-native-ble-manager для обновлений по беспроводной сети (OTA). Во время обновления я отправляю массивы данных на целевое устройство с помощью команды BleManager.write с размером массива, соответствующим MTU. OTA-обновление завершается успешно, но когда я пытаюсь отследить операцию записи в JavaScript, кажется, что все данные передаются одновременно.
Напротив, когда я ранее разрабатывал эту программу на Swift, я мог отслеживать каждую операцию записи с помощью обратных вызовов. Добавив журналы в код ObjC в папке библиотеки iOS, я вижу, что обратные вызовы успешно запускаются при каждой операции записи.
Есть ли способ создать мост между кодом ObjC в папке iOS библиотеки и моим кодом JavaScript для получения этих обратных вызовов? В качестве альтернативы, есть ли другой метод для отслеживания операций записи и расчета процента выполнения на основе общего размера и размера отправленных данных?
Спасибо!



![Безумие обратных вызовов в javascript [JS]](https://i.imgur.com/WsjO6zJb.png)


Настройки библиотеки (react-native-ble-manager в библиотеке);
файл index.d.ts;
Я добавил writeCallback как событие.
export enum BleEventType {
BleManagerDidUpdateState = 'BleManagerDidUpdateState',
BleManagerStopScan = 'BleManagerStopScan',
BleManagerDiscoverPeripheral = 'BleManagerDiscoverPeripheral',
BleManagerDidUpdateValueForCharacteristic = 'BleManagerDidUpdateValueForCharacteristic',
BleManagerConnectPeripheral = 'BleManagerConnectPeripheral',
BleManagerDisconnectPeripheral = 'BleManagerDisconnectPeripheral',
BleManagerPeripheralDidBond = 'BleManagerPeripheralDidBond',
BleManagerCentralManagerWillRestoreState = 'BleManagerCentralManagerWillRestoreState',
BleManagerDidUpdateNotificationStateFor = 'BleManagerDidUpdateNotificationStateFor',
BleManagerWriteCallback = 'BleManagerWriteCallback' // Added Event
}
// Export Callback Function
export interface BleManagerWriteCallbackEvent {
data: any;
}
файл BleManager.m;
Когда происходит процесс записи, приведенный ниже код используется для отправки данных в событие в рамках функции обратной связи.
- (void)peripheral:(CBPeripheral *)peripheral didWriteValueForCharacteristic:(CBCharacteristic *)characteristic error:(NSError *)error {
// Send Data Event
if (hasListeners) {
[self sendEventWithName:@"BleManagerWriteCallback" body:@{@"data": @500}];
}
}
Настройки приложения;
файл bleanager.tsx;
Событие вызывается из библиотеки на странице управления Bluetooth.
BleManager.start({showAlert: true}).then(() => {
const listeners = [
bleManagerEmitter.addListener(
'BleManagerDiscoverPeripheral',
handleDiscoverPeripheral,
),
bleManagerEmitter.addListener(
'BleManagerDisconnectPeripheral',
handleDisconnectedPeripheral,
),
bleManagerEmitter.addListener(
'BleManagerDidUpdateValueForCharacteristic',
handleUpdateValueForCharacteristic,
),
// Added Event
bleManagerEmitter.addListener(
'BleManagerWriteCallback',
handleBleManagerWriteCallback,
),
];
return () => {
for (const listener of listeners) {
listener.remove();
}
};
});
// Callback Function
const handleBleManagerWriteCallback = data => {
console.info(data);
};