React Native 0.29.0版本iOS端BundleURL加載方法

React Native iOS在0.29.0版本中BundleURL加載方法作了重大改變,新增了RCTBundleURLProvider單例類專門處理BundleURL,使用NSUserDefaults保存配置信息。react

默認加載方式

在Debug模式下,執行react-native-xcode.sh編譯腳本會自動獲取當前網卡en0的IP地址,並打入App包中一個配置文件ip.txt,App運行時會讀取ip文件,自動生成Developer Server URL,經過這種加載方式,咱們再也不須要手動去把"localhost"改爲Mac的IP了,每次編譯都會讀取當前最新的IP。ios

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。react-native

手動設置IP

RCTBundleURLProvider在接口中暴露了jsLocation屬性,能夠經過setJsLocation手動設置IP。xcode

NSURL *jsCodeLocation;

[[RCTBundleURLProvider sharedSettings] setDefaults];
#if DEBUG
[[RCTBundleURLProvider sharedSettings] setJsLocation:@"192.168.1.101"];
#endif
jsCodeLocation = [[RCTBundleURLProvider sharedSettings] jsBundleURLForBundleRoot:@"index.ios" fallbackResource:nil];

另須要在Info設置NSAppTransportSecurityNSAllowsArbitraryLoadstrue便可。網絡

總之

RCTBundleURLProvider類作了一些消息和屬性的封裝,能夠經過判斷是否DEBUG環境而後作不一樣的設置。iphone

相關文章
相關標籤/搜索