我有一个使用 react-native-navigation 的 React Native 项目。我已经在 swift 中将这个项目与现有的原生 iOS 应用程序集成在一起。正如 wix 的文档所说,这行代码将通过 native iOS 应用程序:
let jsCodeLocation = RCTBundleURLProvider.sharedSettings().jsBundleURL(forBundleRoot: "index", fallbackResource: nil)
RCCManager.sharedIntance().initBridge(withBundleURL: jsCodeLocation)
问题是,通过调用这行代码,应用程序打开了启动屏幕,而我需要通过按下 native 应用程序中的按钮打开 react native 应用程序并将其作为 viewController 推送,但调用这行代码打开再次启动屏幕,没有任何后退按钮返回 native iOS 应用程序。此外,如果我删除这行代码并改为使用下面的代码,那么我会崩溃。 我也尝试使用此代码作为提到的 react-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)
上面的代码以我希望的方式打开 native react ,但它会因以下错误而崩溃:
Terminating app due to uncaught exception 'NSInternalInconsistencyException', reason: 'A bridge instance is required to create an RCTRootView'
我的 react-native-navigation 版本是:“^1.1.457”
最佳答案
目前,RNN 专为“先 react native ”的应用程序而设计,或者您称之为未开发的 RN 应用程序;引导 API(在 v1 和 v2 中)显示启动画面,但即使您可以解决它 - 这也行不通。有计划在 native 端公开 RNN API,以便像您这样的应用程序能够利用其所有功能。我不知道这什么时候可用,但它在 v2 的路线图中。
也就是说,如果您已经有一个原生应用程序并且想要集成一个 React 原生 View ,那么您实际上并不需要 RNN。是的,RNN 提供了一些非常酷和方便的功能,但您可以完全控制您的 native 屏幕( View Controller ),因此您可以根据需要自行自定义它们。
参见 this guide有关如何将 React Native 与现有应用集成的更多信息。我不确定你为什么会收到这个错误,因为它基本上是你应该实现它的方式,也许由于某种原因它无法创建桥接对象。您可以简化它并通过 initWithBundleURL
创建一个没有桥的 RCTRootView
(在这种情况下,RN 在内部创建桥),但是如果您计划有多个 RN 屏幕和/或 View 之间也相互通信 - 您将需要有一个所有 Root View 共享的桥接实例;这实际上也是 RNN 所做的。
关于ios - 使用 react-native-navigation 将 React Native 应用程序与现有的 iOS 应用程序集成,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51007963/