我有一个原生的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 回答
您应该执行以下操作:
运行以下命令:
react-native bundle --dev false --platform ios --entry-file index.ios.js --bundle-output ios/main.jsbundle --assets-dest ./ios
通过在项目中拖动它们将main.jsbundle和assets目录添加到xcode .
注意:您只需要第一次运行第2步 .
在您的代码中,您声明您的捆绑包在:
http://X.X.X.X:8081/index.ios.bundle?platform=ios
但是,如果它是本地IP或外部网络而不是您的开发环境无法访问,则捆绑URL可能会导致此类问题 .
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并将
ios
文件夹中刚刚创建的main.jsbundle
文件和assets
文件夹拖到Xcode中的项目根目录中 .