這幾天残吩,打算把之前集合到原生項(xiàng)目中的React Native項(xiàng)目在真機(jī)上跑跑哥力,順便試下發(fā)布更新等,理清以后的發(fā)布流程筋栋。零远。苗分。結(jié)果,就一直卡在真機(jī)調(diào)試上了牵辣,明明在網(wǎng)絡(luò)上一堆摔癣,都是超簡單的替換localhost就行。纬向。結(jié)果結(jié)果择浊,試了好久,終于解決了逾条。
正常方案(React Native 0.29.0之前版本)
首先琢岩,你要讓調(diào)試用電腦和你的手機(jī)必須處于相同的 WiFi 網(wǎng)絡(luò)中下
打開 iOS 項(xiàng)目的 AppDelegate.m 文件
更改 jsCodeLocation 中的 localhost 改成你電腦的局域網(wǎng)IP地址(查看IP地址:點(diǎn)擊設(shè)置->網(wǎng)絡(luò)->就可以看到本機(jī)IP)
NSURL *jsCodeLocation;
jsCodeLocation = [NSURL URLWithString: @"http://localhost:8081/index.ios.bundle?platform=ios&dev=true"];
//
// 將localhost換成局域網(wǎng)中主機(jī)Mac的IP地址
jsCodeLocation = [NSURL URLWithString: @"http://10.10.10.60:8081/index.ios.bundle?platform=ios&dev=true"];
- 在 Xcode 中,選擇你的手機(jī)作為目標(biāo)設(shè)備师脂,Run 即可
可以通過晃動設(shè)備來打開開發(fā)菜單(重載担孔、調(diào)試等)
然后發(fā)覺江锨,我試了n久,一直失敗糕篇,提示無連接到服務(wù)器啄育。
感覺這個方法在iOS9之前應(yīng)該都是可以成功的。
原因如下:
Google后查證拌消,iOS9引入了新特性App Transport Security (ATS)挑豌。詳情:App Transport Security (ATS)。
新特性要求App內(nèi)訪問的網(wǎng)絡(luò)必須使用HTTPS協(xié)議拼坎。
(下文提供解決方案)
React Native 0.29.0之后版本方案
React Native iOS在0.29.0版本中BundleURL加載方法做了重大改變浮毯,新增了RCTBundleURLProvider單例類專門處理BundleURL,使用NSUserDefaults保存配置信息泰鸡。
默認(rèn)加載方式
在Debug模式下债蓝,執(zhí)行react-native-xcode.sh編譯腳本會自動獲取當(dāng)前網(wǎng)卡en0的IP地址,并打入App包中一個配置文件ip.txt盛龄,App運(yùn)行時會讀取ip文件饰迹,自動生成Developer Server URL,通過這種加載方式余舶,我們不再需要手動去把”localhost”改成Mac的IP了啊鸭,每次編譯都會讀取當(dāng)前最新的IP。
jsCodeLocation = [[RCTBundleURLProvider sharedSettings] jsBundleURLForBundleRoot:@"index.ios" fallbackResource:nil];
手動設(shè)置IP
RCTBundleURLProvider在接口中暴露了jsLocation屬性匿值,可以通過setJsLocation手動設(shè)置IP赠制。(如果只是本地調(diào)試的話,其實(shí)沒有必要手動設(shè)置哈挟憔,因?yàn)槟J(rèn)加載方式就回讀取當(dāng)前最新的IP)
// 調(diào)用前先設(shè)置IP
[[RCTBundleURLProvider sharedSettings] setJsLocation:@”10.10.10.60”];
App Transport Security 設(shè)置
上面兩種不同的方案主要是針對React Native不同版本做的區(qū)分钟些,,推薦使用第二種方案绊谭,比較簡單直接政恍。
不過如果是iOS9的話,估計(jì)上面的方案均沒有讓你真的調(diào)試成功达传,原因在于:
iOS9引入了新特性App Transport Security (ATS)篙耗。詳情:App Transport Security (ATS)。
新特性要求App內(nèi)訪問的網(wǎng)絡(luò)必須使用HTTPS協(xié)議宪赶。(如果直接用IP地址發(fā)出http請求失敗的話大多數(shù)原因也是這個宗弯,同下解決辦法)
解決辦法:
需要在Info設(shè)置NSAppTransportSecurity的NSAllowsArbitraryLoads為true
<key>NSAppTransportSecurity</key>
<dict>
<key>NSAllowsArbitraryLoads</key>
<true/>
</dict>
效果如下:
花費(fèi)了幾天的時間弄真機(jī)測試和打包更新,因?yàn)榫W(wǎng)上查到的資料大多是以前的搂妻,而NSAppTransportSecurity又是iOS9的新特性罕伯,這個真的很重要哈,所以就作為一個插曲插進(jìn)原本有規(guī)劃的寫作叽讳,分享下追他,希望讀者不用走這歪路。岛蚤。邑狸。如果還是調(diào)試失敗的話歡迎留言討論下哈哈。