本机iOS发布模式

时间:2017-05-08 17:59:46

标签: ios react-native

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

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>

3 个答案:

答案 0 :(得分:12)

您应该执行以下操作:

  1. 运行以下命令:NSPopUpButton
  2. 将main.jsbundle和assets目录添加到xcode中,方法是在项目中拖动它们。
  3. 注意:您只需要第一次运行第2步。

答案 1 :(得分:0)

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

{{1}}

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

答案 2 :(得分:0)

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步,并将刚刚在main.jsbundle文件夹中创建的assets文件和ios文件夹拖到Xcode的项目根目录中。

相关问题