【问题标题】:"No bundle url present" error with react-native iOS release modereact-native iOS 发布模式的“没有捆绑 URL 存在”错误
【发布时间】:2017-10-06 20:28:10
【问题描述】:

我有一个原生 iOS 应用,我们正在使用 react-native 嵌入 Facebook 风格的社交信息流。要在调试模式下运行,我使用打包服务器和以下代码:

NSURL *jsCodeLocation = [NSURL URLWithString:@"http://X.X.X.X:8081/index.ios.bundle?platform=ios"];

bridgeReactView = [[RCTBridge alloc] initWithBundleURL: jsCodeLocation
                                        moduleProvider: nil
                                         launchOptions:nil];

rootReactView = [[RCTRootView alloc] initWithBridge:bridgeReactView
                                         moduleName:@"SocialFeed"
                                  initialProperties:@{}];

其中 X.X.X.X 是我的本地 IP 地址。这工作正常,但我无法将反应代码捆绑到发布版本中。从官方文档和其他 Stack Overflow 帖子中我收集到,最初需要手动将代码与类似的东西捆绑在一起

react-native bundle --entry-file="index.ios.js" --bundle-output="./ios/MyApp/main.jsbundle' --dev=false --platform='ios' --assets-dest="./ios"

并将上面的 jsCodeLocation 定义更改为

*jsCodeLocation = [[NSBundle mainBundle] URLForResource:@"main" withExtension:@"jsbundle"];

显然,在最新版本的 react-native 中,如果您选择发布构建配置,xCode 会自动为您捆绑代码,在这种情况下您必须将上述更改为

NSURL *jsCodeLocation = [[RCTBundleURLProvider sharedSettings] jsBundleURLForBundleRoot:@"index.ios" fallbackResource:nil];

这两种方法都不适合我们 - 在这两种情况下 jsCodeLocation 都设置为 nil,并且我收到“No bundle URL present”错误:

2017-05-08 15:06:56.738 [fatal][tid:main] No bundle URL present.

Make sure you're running a packager server or have included a .jsbundle file in your application bundle.

顺便说一下,我尝试在我的 Info.plist 文件中设置以下值:

<key>NSAppTransportSecurity</key>
    <dict>
        <key>NSAllowsArbitraryLoads</key>
        <true/>
        <key>NSAllowsArbitraryLoadsInWebContent</key>
        <true/>
        <key>NSAllowsLocalNetworking</key>
        <true/>
    </dict>
</key>

【问题讨论】:

  • 你添加 bundle react 原生代码和图片了吗?

标签: ios react-native


【解决方案1】:

您应该执行以下操作:

  1. 运行以下命令:react-native bundle --dev false --platform ios --entry-file index.ios.js --bundle-output ios/main.jsbundle --assets-dest ./ios
  2. 通过将 main.jsbundle 和 assets 目录拖放到您的项目中,将它们添加到 xcode。

注意:您只需在第一次运行第 2 步。

【讨论】:

  • 米娜感谢这个解决方案。我花了将近 2 天的时间。
  • 关于如何在 CI 环境中强制执行此操作的任何建议?
  • 该死!我已经在这几个小时了!非常感谢队友,我不明白为什么这不在 react-native 文档中......
  • 虽然这解决了我的问题,但这感觉是暂时的。我现在有两个main.jsbundle 文件。我可以删除项目文件夹中的那个吗? assets 文件夹包含一些节点模块,每次我添加新模块并手动拖动项目根目录中的资产时,我是否都有此命令?
【解决方案2】:

Mina M 的答案对我来说非常接近,但在调用命令时我收到了 File not found: index.ios.js in any of the project roots 错误。这背后的原因是因为我不再拥有适用于 Android 和 iOS 的单独 index.js 文件 - 我有 1 个(我认为这是现在的标准做法?)。

解决方案 - 在您的 React Native 项目的根目录中运行此程序(包含您的 androidiosnode_modules 文件夹的文件夹): react-native bundle --dev false --platform ios --entry-file index.js --bundle-output ios/main.jsbundle --assets-dest ./ios

然后您必须执行第 2 步,将刚刚在您的 ios 文件夹中创建的 main.jsbundle 文件和 assets 文件夹拖到 Xcode 中的项目根目录中。

【讨论】:

    【解决方案3】:

    在您的代码中,您声明您的捆绑包位于:

    http://X.X.X.X:8081/index.ios.bundle?platform=ios

    但如果它是本地 ip 或外部网络无法访问而不是您的开发环境,则捆绑 url 可能会导致此类问题。

    【讨论】:

    • 您好 Yagiz,感谢您的评论。这是唯一适合我们的方法。我们知道,当未连接到本地网络时,这将不起作用,这就是为什么我们要将 react 代码捆绑到应用程序中 - 这样我们就可以在未连接到 react-native 打包服务器时使用我们的应用程序。
    猜你喜欢
    • 2020-01-08
    • 2018-08-06
    • 2017-08-14
    • 2017-10-15
    • 2018-09-11
    • 2020-05-30
    • 2020-12-31
    • 1970-01-01
    • 2021-02-23
    相关资源
    最近更新 更多