我有一个原生的iOS应用,我们使用react-native来嵌入类似Facebook的社交动态。为了运行调试模式,我使用打包服务器和以下代码:
显然,在react-native的较新版本中,如果您选择发布构建配置,xCode会自动为您捆绑代码,因此您必须将上述内容更改为:
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地址。这个方法很好用,但我无法将react代码捆绑到发布版本中。从官方文档和其他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>