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
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設置NSAppTransportSecurity
的NSAllowsArbitraryLoads
爲true
便可。網絡
RCTBundleURLProvider
類作了一些消息和屬性的封裝,能夠經過判斷是否DEBUG環境而後作不一樣的設置。iphone