React Native (iOS): RCTEventEmitter перед загрузкой JavaScript - PullRequest
0 голосов
/ 15 января 2019

У меня проблема с внедрением маяков в мое приложение.Я использую библиотеку react-native-beacons-manager, но я думаю, что это общая "проблема".

Проблема в том, что когда я закрываю свое приложение (и это важно воспроизвести проблему) и приближаюсь к своему маяку, iOS запускает событие regionDidEnter, которое перехватывается файлом, записанным в нативном кодеи затем отправляется в javascript с использованием метода RCTEventEmitter: [self sendEventWithName:@"regionDidEnter" body:event];

Проблема заключается в том, что это событие вызывается до полной загрузки javascript, поэтому мой слушатель:

// component.js
Beacons.BeaconsEventEmitter.addListener('regionDidEnter', b => {
        //code
      });

не вызывается.

Порядок событий:

[BeaconsDemo] Did finish launching enter
[BeaconsDemo] Did finish launching After jsBundleURLForBundleRoot
[BeaconsDemo] Did finish launching After RCTRootView alloc
[BeaconsDemo] Did finish launching After UIWindow alloc
[BeaconsDemo] Did finish launching After makeKeyAndVisible
[BeaconsDemo] Did finish launching end
--iOS send the event and it is caught by RNiBeacon but it has no listeners yet--
[BeaconsDemo] no listeners in RnIBeacon.m
--Register
[BeaconsDemo] regionDidExit
-- First line of javascript --
[BeaconsDemo] start observing
[BeaconsDemo] requestAlwaysAuth

Есть идеи справиться с этой ситуацией?Есть ли способ или способ отправить событие через RCTEventEmitter в ожидании загрузки javascript?

Спасибо

1 Ответ

0 голосов
/ 15 января 2019

Эта общая проблема также существует при написании собственных приложений-маяков для iOS или Android. Решение состоит в том, что вы должны настроить свой «крючок», который включает мониторинг маяка и добавляет прослушиватель событий (или обратный вызов делегата / уведомления, как он вызывается в собственном коде) в соответствующем месте для платформы:

iOS: AppDelegate.didFinishLanching(options: )

Android: Application.onCreate()

Ключ в том, что эта настройка должна быть завершена до возврата этих методов.

Это же правило применяется к ReactNative. Уловка с ReactNative заключается в том, что по умолчанию JavaScript не запускается для этих событий - он запускается только при запуске экрана, что слишком поздно настраивает ловушку, чтобы вышеуказанное сработало, когда ваше приложение убито. Чтобы это сработало, вам нужно будет удалить приложение, чтобы вы могли настроить собственный нативный код в вышеупомянутых обратных вызовах.

Два варианта:

  1. Реализация обнаружения маяков изначально (проще всего, но требует собственного кодирования для каждой платформы)
  2. Добавьте собственный код в вышеупомянутые собственные обратные вызовы, который запускает RCTBridge на iOS и запускает представление, которое выполняет код, который запускает наш код JavaScript для настройки обнаружения маяков. В Android эквивалент будет состоять в создании новых ReactRootView и ReactNativeInstanceManager таким образом, чтобы он вызывал ваш код JavaScript для настройки обнаружения маяков.

Я лично не проверял вариант 2, чтобы посмотреть, сможет ли он установить крючки достаточно быстро. Если это сработает, это, безусловно, будет сложнее, чем собственное решение, но позволит вам сохранить логику обнаружения маяков в JavaScript.

...