react-native iOS 发布模式出现“不存在捆绑包 url”错误

问题描述 投票:0回答:4

我有一个原生 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,并且我收到“不存在捆绑包 URL”错误:

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>
ios react-native
4个回答
17
投票

您应该执行以下操作:

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

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


3
投票

Mina M 的答案对我来说非常接近,但我在调用命令时遇到了

File not found: index.ios.js in any of the project roots
错误。这背后的原因是因为我不再拥有适用于 Android 和 iOS 的单独的 index.js 文件 - 我有 1 个(我相信这是现在的标准做法?)。

解决方案 - 在 React Native 项目的根目录中运行此命令(包含

android
ios
node_modules
文件夹的文件夹):

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

然后您必须执行步骤 2,并将刚刚在

main.jsbundle
文件夹中创建的
assets
文件和
ios
文件夹拖到 Xcode 中的项目根目录中。


0
投票

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

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

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


0
投票

我尝试了上面的所有解决方案,但直到我取消选中“仅用于安装版本”(如下面的屏幕截图)时它才起作用。

注意:确保 Metro 捆绑器正在工作。

© www.soinside.com 2019 - 2024. All rights reserved.