React Native BLE Manager: проблема обратного вызова записи обновления по беспроводной сети

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

Напротив, когда я ранее разрабатывал эту программу на Swift, я мог отслеживать каждую операцию записи с помощью обратных вызовов. Добавив журналы в код ObjC в папке библиотеки iOS, я вижу, что обратные вызовы успешно запускаются при каждой операции записи.

Есть ли способ создать мост между кодом ObjC в папке iOS библиотеки и моим кодом JavaScript для получения этих обратных вызовов? В качестве альтернативы, есть ли другой метод для отслеживания операций записи и расчета процента выполнения на основе общего размера и размера отправленных данных?

Спасибо!

Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
2
0
90
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Настройки библиотеки (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);
};

Другие вопросы по теме

Реакция на собственный часовой Использование необъявленного идентификатора «kSentryLevelWarning»
Как автоматически протестировать потоки nfc e2e на реальных мобильных устройствах
RCTAppDelegate::bundleURL не реализован», причина: «Подклассы должны реализовать действительный метод getBundleURL»
Как позиционировать элементы с помощью CGContext, чтобы они правильно отображались в представлении SwiftUI
Как проверить, успешно ли добавлен мой сертификат в связку ключей устройства
Не могу создать свое приложение .NET 8 Maui в эмуляторе iOS
UIActivityViewController отображается в неправильном положении на iPad, когда он представлен в виде всплывающего окна в SwiftUI
Xcode «Отсутствует пакетный продукт GoogleUtilities_UserDefaults» после обновления до последней версии пакета с использованием SPM
Проблема с компилятором среды SwiftUI Observable – невозможно найти в области видимости
Xcode 15 Без категории (Xcode): команда CodeSign завершилась неудачно с ненулевым кодом выхода