M1芯片不使用Rosetta时Xcode无法构建React Native项目问题咨询
问题成因
该问题本质是Apple Silicon设备上的架构适配冲突,核心原因如下:
- React Native项目中大量旧版本第三方原生依赖仅提供了x86_64架构的二进制切片,未适配Apple Silicon对应的arm64架构。Rosetta的作用是将x86_64指令转译为arm64指令,开启Rosetta运行Xcode时,会默认按x86_64架构构建项目,所有依赖的架构都能匹配,因此可以正常构建。
- 直接打开Xcode构建时,默认会读取当前设备的原生架构(arm64),你之前配置的排除arm64操作大概率仅作用于主项目,未覆盖Pods依赖项目,或是配置未持久化,执行
pod install后被重置,因此配置不生效。 npm run ios可以正常构建的原因是React Native官方CLI默认会在Apple Silicon设备上给xcodebuild命令注入ARCHS=x86_64参数,强制按x86_64架构构建,和开启Rosetta运行Xcode的构建逻辑完全一致。
无需Rosetta运行Xcode的解决方案
步骤1:修正持久化架构排除配置
- 打开项目的iOS工作空间文件(后缀为
.xcworkspace,请勿直接打开.xcodeproj文件) - 选中左侧导航栏最顶层的主项目,在右侧「构建设置」中找到
Excluded Architectures配置项,给Debug、Release所有编译模式的Any iOS Simulator SDK选项添加值arm64 - 继续选中左侧导航栏的Pods项目,同样在「构建设置」中找到
Excluded Architectures,给所有编译模式的Any iOS Simulator SDK选项添加值arm64 - 为了避免后续执行
pod install覆盖Pods项目的配置,在项目根目录的ios/Podfile中添加如下post_install钩子:
post_install do |installer| installer.pods_project.build_configurations.each do |config| config.build_settings["EXCLUDED_ARCHS[sdk=iphonesimulator*]"] = "arm64" end end
配置完成后在ios目录下执行pod install使配置生效。
步骤2:全量清理缓存重试
关闭Xcode后,在项目根目录执行以下命令清理所有构建缓存:
rm -rf ~/Library/Developer/Xcode/DerivedData rm -rf ios/build cd ios && pod deintegrate && pod install
完成后直接打开Xcode(不要勾选Rosetta启动选项),选择模拟器目标执行构建即可。
步骤3:极端情况适配
如果以上操作后依然构建失败,说明项目中存在完全未适配Apple Silicon模拟器的第三方依赖,可将对应依赖升级到适配Apple Silicon的最新版本,或是单独给该依赖配置Excluded Architectures排除arm64架构即可。
内容的提问来源于stack exchange,提问作者Haktan ERSOY
相关产品推荐
相关产品推荐

