React Native iOS在0.29.0版本中BundleURL加载要领做了严重转变,新增了RCTBundleURLProvider
单例类特地处置惩罚BundleURL,运用NSUserDefaults
保留设置信息。
默许加载体式格局
在Debug形式下,实行react-native-xcode.sh编译脚本会自动猎取当前网卡en0的IP地点,并打入App包中一个设置文件ip.txt,App运转时会读取ip文件,自动天生Developer Server URL,经由过程这类加载体式格局,我们不再须要手动去把”localhost”改成Mac的IP了,每次编译都邑读取当前最新的IP。
if [[ "$CONFIGURATION" = "Debug" && "$PLATFORM_NAME" != "iphonesimulator" ]]; then
PLISTBUDDY='/usr/libexec/PlistBuddy'
PLIST=$TARGET_BUILD_DIR/$INFOPLIST_PATH
IP=$(ipconfig getifaddr en0)
$PLISTBUDDY -c "Add NSAppTransportSecurity:NSExceptionDomains:localhost:NSTemporaryExceptionAllowsInsecureHTTPLoads bool true" $PLIST
$PLISTBUDDY -c "Add NSAppTransportSecurity:NSExceptionDomains:$IP.xip.io:NSTemporaryExceptionAllowsInsecureHTTPLoads bool true" $PLIST
echo "$IP.xip.io" > "$DEST/ip.txt"
fi
非Debug形式时,没有ip.txt文件,会直接读取当地jsbundle文件,和之前版本的Load from pre-bundled file on disk体式格局雷同。
然则我经由测试发明,en0是Wifi的收集,假如封闭Wifi,运用网线端口衔接收集,en0默许就是inactive,没有对应的IP。
手动设置IP
RCTBundleURLProvider在接口中暴露了jsLocation
属性,能够经由过程setJsLocation
手动设置IP。
NSURL *jsCodeLocation;
[[RCTBundleURLProvider sharedSettings] setDefaults];
#if DEBUG
[[RCTBundleURLProvider sharedSettings] setJsLocation:@"192.168.1.101"];
#endif
jsCodeLocation = [[RCTBundleURLProvider sharedSettings] jsBundleURLForBundleRoot:@"index.ios" fallbackResource:nil];
另须要在Info设置NSAppTransportSecurity
的NSAllowsArbitraryLoads
为true
即可。
总之
RCTBundleURLProvider
类做了一些音讯和属性的封装,能够经由过程推断是不是DEBUG环境然后做差别的设置。