在开发 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
。
默认生成的jsCodeLocation
在AppDelegate.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];
|
现在配置已经完成了, 可以运行了。