интегрировать собственное приложение React с помощью встроенной навигации в существующее приложение iOS

У меня есть проект React Native, который использует response-native-navigation. Я быстро интегрировал этот проект с существующим родным приложением iOS. Как сказано в документации wix, эта строка кода покажет собственное приложение реакции через родное приложение iOS. :

let jsCodeLocation = RCTBundleURLProvider.sharedSettings().jsBundleURL(forBundleRoot: "index", fallbackResource: nil)
RCCManager.sharedIntance().initBridge(withBundleURL: jsCodeLocation)

Проблема в том, что, вызывая эту строку кода, приложение открывает экран запуска, тогда как мне нужно открыть собственное приложение для реагирования, нажав кнопку в собственном приложении и нажав его как viewController, но вызов этой строки кода открывает экран запуска. снова без кнопки возврата, чтобы вернуться в собственное приложение iOS. Кроме того, если я удалю эту строку кода и вместо этого использую приведенный ниже код, я получу сбой. Я также пробовал использовать этот код в качестве упомянутой документации по интеграции response-native, но он не работает с react-native-navigation:

let jsCodeLocation = RCTBundleURLProvider.sharedSettings().jsBundleURL(forBundleRoot: "index", fallbackResource: nil)

let bridge = RCTBridge(bundleURL: jsCodeLocation, moduleProvider: nil, launchOptions: nil)
let rootView = RCTRootView(bridge: bridge, moduleName: "MyHotels", initialProperties: nil)


let rnViewController = UIViewController()
rnViewController.view = rootView

self.navigationController?.pushViewController(rnViewController, animated: true)

Приведенный выше код открывает собственный ответ так, как я хочу, но он выйдет из строя с ошибкой ниже:

Завершение работы приложения из-за неперехваченного исключения «NSInternalInconsistencyException», причина: «Для создания RCTRootView требуется экземпляр моста»

моя версия для реагирования на родную навигацию: "^ 1.1.457"


person Delyar Tabatabai    schedule 24.06.2018    source источник


Ответы (1)


На данный момент RNN разработана для приложений, которые «реагируют в первую очередь на нативные», или для того, что вы бы назвали приложением RN с нуля; API начальной загрузки (как в v1, так и в v2) показывает экран-заставку, но даже если бы вы могли его обойти - это не сработало бы. Есть планы предоставить RNN API на нативной стороне, чтобы приложения, подобные вашему, могли использовать все его возможности. Я не могу сказать, когда это будет доступно, но это в дорожной карте v2.

Тем не менее, если у вас уже есть собственное приложение и вы хотите интегрировать собственное представление React, вам действительно не нужен RNN. Да, есть несколько довольно интересных и удобных функций, которые предоставляет RNN, но у вас есть полный контроль над вашими родными экранами (контроллерами просмотра), поэтому вы можете настраивать их по мере необходимости самостоятельно.

Дополнительную информацию о том, как для интеграции React Native с существующими приложениями. Я не уверен, почему вы получаете эту ошибку, потому что это в основном способ, которым вы должны ее реализовать, возможно, по какой-то причине не удается создать объект моста. Вы можете упростить его и создать RCTRootView без моста через initWithBundleURL (в этом случае RN создает мост внутри), но если вы планируете иметь несколько экранов RN и / или представлений, которые также обмениваются данными между собой - вам потребуется один экземпляр моста, общий для всех корневых представлений; это фактически то, что делает и RNN.

person Artal    schedule 27.06.2018
comment
Я прокомментировал код строки [[self class] showSplashScreen] в RCCManager, и экран запуска не отображается. - person Hamidreza Shokouhi; 27.06.2018
comment
да, это не будет отображаться, если вы закомментируете это, но все же у вас нет доступа к работе RNN из родного. Если у вас есть собственный интерфейс, который должен отображать представление RN, использование RNN в настоящий момент не подходит, вы, вероятно, столкнетесь с другими проблемами позже. - person Artal; 27.06.2018
comment
@Artal, спасибо за ответ, но я вас не совсем понял. Как мне не нужен RNN, когда я использовал его в моем собственном приложении React? Мне нужно инициализировать RCTBridge для RCCManager, чтобы приложение RN отображалось внутри моего собственного быстрого приложения. В противном случае я получу сообщение об ошибке «Требуется экземпляр моста для создания RCTRootView». - person Delyar Tabatabai; 28.06.2018
comment
Комментирование строки [[self class] showSplashScreen] в RCCManager.m спасло меня. - person Delyar Tabatabai; 28.06.2018
comment
@DelyarTabatabaei Я не знаю, каковы планы насчет остальной части вашего приложения. Я имел в виду, что если вы просто хотите нажать на один экран, на котором есть встроенная в реакцию RCTRootView, вам не понадобится RNN. - person Artal; 28.06.2018