React Native run-ios构建成功但Metro无法连接iOS模拟器
React Native 0.66 + Xcode 13 iOS模拟器无法连接Metro、启动闪退修复方案
该问题为React Native 0.66版本与Xcode 13.0、iOS 15模拟器的已知兼容问题,常规清缓存、重装依赖、重装环境无法解决,核心诱因有三点:
- Xcode 13默认将iOS 15模拟器的
localhost解析为IPv6地址::1,但Metro默认仅监听IPv4的127.0.0.1,连接直接被拒绝 - Xcode 13默认在Debug构建中开启死代码剥离,会误删RN初始化Metro连接的相关逻辑,导致app启动无入口直接闪退
- RN 0.66内置的Xcode构建脚本未适配iOS 15模拟器的bundle路径规则,app启动时找不到js入口资源直接崩溃
分步修复操作
1. 清理残留进程
先执行命令彻底关闭所有相关进程,避免旧配置缓存干扰:
killall -9 node Metro Simulator Xcode rm -rf ~/Library/Developer/Xcode/DerivedData/*
2. 修正Metro监听配置
在项目根目录找到metro.config.js(不存在则新建),添加server配置强制监听IPv4地址,原有配置全部保留:
module.exports = { // 原有其他配置项保持不变 server: { port: 8081, host: '127.0.0.1', }, };
3. 配置iOS本地网络权限
打开iOS项目下的ios/[你的项目名]/Info.plist文件,在NSAppTransportSecurity节点下添加本地网络例外配置,原有配置不要删除:
<key>NSAppTransportSecurity</key> <dict> <!-- 原有ATS配置保留 --> <key>NSAllowsLocalNetworking</key> <true/> <key>NSExceptionDomains</key> <dict> <key>localhost</key> <dict> <key>NSExceptionAllowsInsecureHTTPLoads</key> <true/> </dict> </dict> </dict>
4. 修改Xcode Debug构建设置
- 用Xcode打开
ios/[你的项目名].xcworkspace,选中左侧项目根节点,选择对应Debug环境的Target,切换到Build Settings标签页 - 搜索
Dead Code Stripping,将Debug模式下的配置值从Yes改为No(该配置是闪退核心原因,Xcode 13默认给Debug开启该选项,会误删RN的Metro连接初始化代码) - 搜索
Other Linker Flags,确认Debug模式下存在-ObjC、-lc++两个参数,缺失则手动补充
5. 修正RN构建脚本的iOS15路径兼容问题
打开项目下的node_modules/react-native/scripts/react-native-xcode.sh文件,找到模拟器环境下设置bundle路径的代码块:
if [[ "$PLATFORM_NAME" == *simulator ]]; then BUNDLE_FILE="${BUILT_PRODUCTS_DIR}/${EXECUTABLE_FOLDER_PATH}/main.jsbundle" fi
替换为适配iOS15模拟器路径的逻辑:
if [[ "$PLATFORM_NAME" == *simulator ]]; then # iOS15模拟器修改了.app包的路径层级,原有逻辑会找不到bundle if xcrun simctl list devices | grep "iOS 15.0" | grep -q "Booted"; then BUNDLE_FILE="${BUILT_PRODUCTS_DIR}/${EXECUTABLE_NAME}.app/main.jsbundle" else BUNDLE_FILE="${BUILT_PRODUCTS_DIR}/${EXECUTABLE_FOLDER_PATH}/main.jsbundle" fi fi
验证流程
- 项目根目录执行
yarn start --reset-cache,等待Metro完全启动显示欢迎界面,不要关闭该窗口 - 新开一个终端窗口,执行
react-native run-ios --no-packager,等待构建完成 - 构建完成后模拟器会自动启动app,第一次启动如果弹出本地网络权限申请,必须点击“允许”
- 观察Metro窗口,出现
Bundling complete日志即代表连接正常
补充排查
如果完成上述操作后依然闪退,打开Mac自带的Console应用,选中左侧当前启动的模拟器设备,筛选你的app包名查看闪退日志:
- 日志报
Connection refused:检查Metro是否正常监听127.0.0.1:8081,确认没有其他程序占用8081端口 - 日志报
Code signature invalid:回到Xcode的Build Settings,将Debug模式的签名团队修改为你自己的Apple ID,开启自动签名 - 日志报
dyld: Library not loaded:进入ios目录执行pod install --repo-update重新安装依赖
内容的提问来源于stack exchange,提问作者not_fubar_yet
相关产品推荐
相关产品推荐

