1. 程式人生 > >React-Native頻繁修改IP,煩嗎

React-Native頻繁修改IP,煩嗎

React-Native 開發中,從模擬器切換到真機你必須要做的是:開啟AppDelegate.m,將jsCodeLocation = [NSURL URLWithString:@"http://localhost:8081/index.ios.bundle?platform=ios&dev=true"];修改為jsCodeLocation = [NSURL URLWithString:@"http://【你的IP】:8081/index.ios.bundle?platform=ios&dev=true"];, 從真機切換到模擬器,你又得修改一次,如此反覆。更煩的是,團隊開發的時候,有人不小心把他的IP push上去了,你pull下來的時候一編譯執行,怎麼自己修改的JS程式碼都不起作用呢?然後各種log,最後發現,尼瑪,連線到別人IP去了。反正就是各種坑。
如果你也遇到以上的問題,那就繼續看下去哈。
解決這個問題,其實很簡單,只要我們判斷一下如果是在模擬器上執行的話就用localhost

,如果是真機的話就是用計算機的IP,Objective-C 也為我們提供了這樣一個巨集:TARGET_OS_SIMULATOR 用來判斷是否是在模擬器上執行,所以我們可以很簡單的寫出下面的程式碼:

#if TARGET_OS_SIMULATOR
  jsCodeLocation = [NSURL URLWithString:@"http://localhost:8081/index.ios.bundle?platform=ios&dev=true"];
#else
#warning "DEBUG DEVICE"
  NSString *serverIP = 【你的IP】;
  NSString
*jsCodeUrlString = [NSString stringWithFormat:@"http://%@:8081/index.ios.bundle?platform=ios&dev=true", serverIP]; jsCodeLocation = [NSURL URLWithString:jsCodeUrlString]; #endif

這樣,就完成了。但是如果是 release 的話想使用打包的檔案咋辦? 我們可以直接判斷:如果是在 debug 下的話就是用上面的程式碼,否則則是用 bundle,如下:

#if DEBUG
#if TARGET_OS_SIMULATOR
#warning "DEBUG SIMULATOR" jsCodeLocation = [NSURL URLWithString:@"http://localhost:8081/index.ios.bundle?platform=ios&dev=true"]; #else #warning "DEBUG DEVICE" NSString *serverIP = 【你的IP】; NSString *jsCodeUrlString = [NSString stringWithFormat:@"http://%@:8081/index.ios.bundle?platform=ios&dev=true", serverIP]; jsCodeLocation = [NSURL URLWithString:jsCodeUrlString]; #endif #else //release jsCodeLocation = [[NSBundle mainBundle] URLForResource:@"main" withExtension:@"jsbundle"]; #endif

這樣,我們就能在 debug 和 release 都不用修改程式碼了。但是,有個問題,這個【你的IP】很是礙眼啊,公司和家裡的 IP 肯定不一樣啊,不還是得改。而且如果將這程式碼 push 到伺服器,其他人也還是要改,根本問題還是不能解決。如果我們能動態獲取到計算機的 IP 問題就解決了。是的,接下來我們要做的就是這個,在終端上獲取 IP 的命令是(Linux和Mac OS):ifconfig
ifconfig
但是這樣會獲取到一堆資訊,我們需要的只是一個 IP。通過下面的命令,我們可以獲取到我們要的那一行資訊:ifconfig | grep inet\\ | tail -1
ifconfig | grep inet\ | tail -1
通過grep命令可以進行文字的檢索,再通過 tail -【number】命令來從文字末尾開始選擇要顯示的行數(預設是10行),我們只要一行,然後從這一行中再取出 IP。 最後通過命令:ifconfig | grep inet\\ | tail -1 | cut -d " " -f 2即可獲取到最終想要的 IP 了。
獲取IP
其中, cut -d " " 表示將文字按空格分割, -f 2 表示顯示分割後的第二個元素,也就是 IP 地址了。
好了,現在獲取到 IP 地址了。我們知道,XCode 提供了一個在編譯時執行指令碼的功能,如圖:
插入指令碼
然後貼上如下程式碼將獲取到的 IP 寫入到 plist 檔案中。

INFOPLIST="${TARGET_BUILD_DIR}/${INFOPLIST_PATH}"
echo "writing to $INFOPLIST"
PLISTCMD="Add :SERVER_IP string $(ifconfig | grep inet\\ | tail -1 | cut -d " " -f 2)"
echo -n "$INFOPLIST" | xargs -0 /usr/libexec/PlistBuddy -c "$PLISTCMD" || true
PLISTCMD="Set :SERVER_IP $(ifconfig | grep inet\\ | tail -1 | cut -d " " -f 2)"
echo -n "$INFOPLIST" | xargs -0 /usr/libexec/PlistBuddy -c "$PLISTCMD" || true

寫入IP
這樣,每次編譯程式的時候就會將 IP 寫入到 plist 檔案了。

Paste_Image.png
這一步完成後,就可以將前面的 【你的IP】直接從 plist 檔案那取了。如下:

  NSString *serverIP =  [[NSBundle mainBundle] objectForInfoDictionaryKey:@"SERVER_IP"];

到這,基本就完成了。但是還有個問題:如果我們還想在真機上執行並且在 Chrome 上進行 Debug,那我們還需修改一下 RCTWebSocketExecutor.m 這個檔案。將這個檔案的 init 方法替換成一下程式碼即可:

- (instancetype)init
{
  NSUserDefaults *standardDefaults = [NSUserDefaults standardUserDefaults];
  NSInteger port = [standardDefaults integerForKey:@"websocket-executor-port"] ?: 8081;
#if TARGET_OS_SIMULATOR
  NSString *URLString = [NSString stringWithFormat:@"http://localhost:%zd/debugger-proxy", port];
#else
  NSString *serverIP = [[NSBundle mainBundle] objectForInfoDictionaryKey:@"SERVER_IP"];
  NSString *URLString = [NSString stringWithFormat:@"http://%@:%zd/debugger-proxy", serverIP, port];
#endif
  return [self initWithURL:[RCTConvert NSURL:URLString]];
}

總結

通過判斷當前執行裝置的巨集以及編譯時通過指令碼將 IP 寫入 plist 檔案我們就可以實現動態的設定 IP 了,以後我們就不需要反覆修改 IP 了。另外,通過jsCodeLocation = [[NSBundle mainBundle] URLForResource:@"main" withExtension:@"jsbundle"]; 的方式執行的時候,我們也可以將打包的命令寫到指令碼上,這樣就不用再通過終端去打包了。

補充

通過這些天的實踐,出現了一個問題,有時候用 grep 來篩選 IP 的時候,找到的不一定準確,因為我們現在通過 grep找出 IP 之後,取的是最後個 IP 。而如果這時候我們運行了 android的模擬器就會出現下面的情況:
兩個 IP
這時我們使用的就是最後一個 IP,也就是模擬器的 IP 了。實在想不到好的解決方案,所以根據現在的規律,暴力的將命令改成了:
ifconfig | grep 'inet 192' | head -1 | cut -d " " -f 2 ,現在是直接檢索 inet 192 然後獲取第一個 IP。由於能力有限,只能想到這個方法了,如果大家有更好的方法來獲取,可以評論指點下我哈。

相關推薦

React-Native頻繁修改IP

React-Native 開發中,從模擬器切換到真機你必須要做的是:開啟AppDelegate.m,將jsCodeLocation = [NSURL URLWithString:@"http://localhost:8081/index.ios.bundle?p

編譯依賴於React Native0.46.4的React Native IOS工程時出現錯誤“fatal error: 'React/RCTEventEmitter.h' file not found”

問題 clear solution str ack fat navi parallel avi 我的環境: WebStorm 2017.2Build #WS-172.3317.70, built on July 14, 2017 JRE: 1.8.0_152-release

win10的react native 開發環境搭建使用Android模擬器

1.開啟cmd的管理員模式,win+X,選擇命令提示符(管理員)即可,執行如下命令: @"%SystemRoot%\System32\WindowsPowerShell\v1.0\powershell.exe" -NoProfile -InputFormat None -ExecutionPolicy

基於React Native官方元件FlatList增加可定製化“下拉重新整理”、“下拉載入更多”元件API的新列表元件react-native-refresh-loadmore-flatlist

react-native-refresh-loadmore-flatlist 基於React Native官方元件FlatList,增加可定製化“下拉重新整理”、“下拉載入更多”元件API的新列表元件,具體實現功能如下: 自定義下拉重新整理元件API 自定義上拉Lo

react native xcode修改專案名

1. 選中舊工程名,改為新的 然後選擇rename 2. 依次選擇黃色資料夾,修改名字,千萬不要在Xcode外修改!!! 修改結果為 3. 點選搜尋,搜尋舊專案名 點選Find,改為Replace 全部替換掉 4. 此時,還剩下一些需要手動修

React Native專案修改包名

打release包時,要修改包名 1,修改defaultConfig, applicationId:應用的唯一標識() versionCode :釋出到平臺後,版本更新使用(版本迭代時注意) versionName:顯示應用的版本(作用不大)   2,修改MainActi

Android Studio 模擬器開啟dev setting 修改IP重新Reload

在你建立的專案下,開啟cmd 執行命令: adb shell input keyevent 82 模擬器上彈出dev settings視窗 選擇Debug server host & port for device 輸入本機的IP及相應的埠 預設埠號是8081,但如

React-Native實現登入頁面並顯示和清除使用者的輸入

/** * Sample React Native App * https://github.com/facebook/react-native * ES6實現程式碼 */ import Re

React-Native修改包名(Android)

之前我的包名是com.secondren; 修改的第一個地方:MainApplication和MainActivity這二個java檔案的package com.ancely.secondren;改成自己想要的比如:package com.xxx.xxx。

安卓嵌入react native 環境的步驟Could not get BatchedBridge, make sure your bundle is packaged correctly問題的解決

    條件:  安卓。     今天給原生嵌入react native的環境時突然就出現了這個錯誤。點選reload就直接說連不上伺服器。     先說步驟吧。     1.   在app/build.gradle中加入依賴。compile'com.facebook.re

react-native之上拉載入下拉重新整理元件封裝

react-native 自定義封裝重新整理元件 幾個月沒寫部落格了,最近一直在寫react 和react-native,前幾天剛發了一版基於react-native混合開發的App,這幾天趕快總結下。 寫過java的同學,再去學習react和rea

在window下搭建react-native開發環境配置並通過react-native-cli生成一個專案執行

安裝些基本軟體,自行找教程,記得配置下環境變數 安裝python2 安裝jdk node、yarn 模擬器Genymotion傳送門 安裝android studio 然後看著教程將SDK裝好傳

React-Native(二)引入專案在windows上執行已有的Demo for Android

專案是一個在交流群裡認識的群友的,他現在只能在mac上跑通專案,所以我想試一下能不能在windows環境下跑通Android專案 1.首先我是將專案放到了自己新建的RN目錄的workspace資料夾下,像正常啟動專案一樣到目錄下,react-native start,此時出

react-native遇到的坑及解決方法

2. 新增tabBar 時新增 selected = { this.state.selectedTab === 'FaceMash' }  這句話 ,會報 null not an object(evaluating this.state.selectedTab)  提示

React Native Awesome(匯聚知識分享精華)

React Native Awesome彙集了各類react-native學習資料、工具、元件、開源App、資源下載、以及相關新聞等,只求精不求全。 如果你是一名React Native愛好者,或者有一顆熱愛鑽研新技術的心,喜歡分享技術乾貨、專案經驗、以及你在Reac

React-Native修改index.android.js檔案後Genymotion程式不更新問題

最近在學習React-Native的移動端App開發,使用Genymotion模擬器除錯程式碼,用Sublime Text 3編寫程式碼。 每次修改js程式碼之後,我們都是雙擊R來重新整理Genymo

Angular團隊公布路線圖並演示怎樣與React Native集成

content ogl date pda andro 演講稿 服務 團隊 stat 本文來源於我在InfoQ中文站翻譯的文章,原文地址是:http://www.infoq.com/cn/news/2015/06/angular-2-react-native-roadmap

react-native服務啟動運行項目到安卓模擬器

時間 輸入 nat bundle cmd 模擬器 項目 等待 模擬 1、在CMD中進入要啟動的項目下,輸入react-native start,等待啟動成功。成功之後再瀏覽器中訪問http://localhost:8081/index.android.bundle?plat

編譯依賴於React Native0.46.4的工程報錯“react-native-xcode.sh now lives in a different location”

webstorm alt where git span command com pen app 我的環境: WebStorm 2017.2Build #WS-172.3317.70, built on July 14, 2017 JRE: 1.8.0_152-release

React-Native 集成個推需要註意的地方

activit ive 方法 手動 creat nac activity ati push 1, 安卓,可能需要手動寫覆蓋onCreate的方法 註意: 有可能您的MainActivity中未重寫onCreate方法,如果未重寫,請重寫onCreate方法,方法如下