0%

ReactNative-iOS真机调试自动配置服务器IP

在开发 ReactNative 应用时,jsbundle 有两种加载方式。第一种是指定 url 通过网络进行加载;第二种是 pre-bundled 将 jsbundle 文件打包进 app 安装包中。
编译生成的安装包有 Debug 和 Release 两种模式,在 Debug 模式下默认是使用第一种方式加载 jsbundle,在 Release 模式下默认是使用第二种方式。

最原始的办法(不推荐)

初始化后的项目想要真机调试,只好去修改:Libraries–>RCTWebSocket.codeproj–>RCTWebSocketExecutor.m中的localhost,将它修改为本地服务器的IP(通过终端ifconfig命令查看)

该方法太麻烦,一不小心把自己的IP提交上去了,会与其他同事产生冲突


自动配置 serverIP 的方案

步骤一 添加 Run Script

在 Xcode 中选择“Build Phases”,然后点击左上角的”+”选择“New Run Script Phase”。
在列表最后出现了“Run Script”,将其展开,然后编辑代码块的内容:

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

注意:这里要解释一下,我们公司的网段是192的,所以我过滤用的是grep 'inet 192',大家可以根据实际网段进行修改。

步骤二 编辑 jsCodeLocation

默认生成的jsCodeLocationAppDelegate.m中,删掉默认生成的,并添加下面的代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
    NSURL *jsCodeLocation;
#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 = [[NSBundle mainBundle] objectForInfoDictionaryKey:@"SERVER_IP"];
NSString *jsCodeUrlString = [NSString stringWithFormat:@"http://%@:8081/index.ios.bundle?platform=ios&dev=true", serverIP];
NSString *jsBundleUrlString = [jsCodeUrlString stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding];
jsCodeLocation = [NSURL URLWithString:jsBundleUrlString];
#endif
#else
#warning "PRODUCTION DEVICE"
jsCodeLocation = [[NSBundle mainBundle] URLForResource:@"main" withExtension:@"jsbundle"];
#endif

步骤三 编辑 RCTWebSocketExecutor.m 文件

在 Xcode 中打开 -> Libraries -> RCTWebSocket.xcodeproj -> RCTWebSocketExecutor.m 文件,大概在文件 53 行左右的位置,将
NSString *URLString = [NSString stringWithFormat:@”http://localhost:%zd/debugger-proxy?role=client“, port];

修改为:

1
2
3
4
5
6
#if TARGET_OS_SIMULATOR
NSString *serverIP = @"localhost";
#else
NSString *serverIP = [[NSBundle mainBundle] objectForInfoDictionaryKey:@"SERVER_IP"];
#endif
NSString *URLString = [NSString stringWithFormat:@"http://%@:%zd/debugger-proxy?role=client", serverIP, port];

现在配置已经完成了, 可以运行了。