升级Xcode到13.0.0后Flutter iOS项目CircleCI打包ARCHIVE FAILED求助
问题诱因
这个问题是Xcode 13版本的规则变更和CI环境特性共同导致的,核心原因有两个:
- Xcode 13收紧了Run Script阶段的执行权限校验,且默认启用的新构建系统对输入输出文件的路径合法性要求更严格,CI环境的路径权限、缓存状态和本地开发环境不一致时,就会触发脚本非零退出
- Xcode 13不再支持8.0版本的iOS部署目标,日志中Pods的部署版本警告虽然不是直接报错原因,但会衍生出架构切片、签名校验的连锁问题,在CI无交互环境下会直接导致构建失败
可落地的解决步骤
- 第一步:打开iOS项目的Xcode工程,找到Runner目标的Build Phases面板中名为Run Script的Flutter构建脚本项,勾选For install builds only选项,避免非必要场景重复执行脚本
- 第二步:在ios/Podfile文件的post_install块中添加统一配置,修正所有Pod的部署版本和Xcode 13兼容参数,示例如下:
post_install do |installer| installer.pods_project.targets.each do |target| flutter_additional_ios_build_settings(target) target.build_configurations.each do |config| # 统一最低部署版本到Xcode 13支持的9.0 config.build_settings['IPHONEOS_DEPLOYMENT_TARGET'] = '9.0' # 排除模拟器arm64架构,避免打包冲突 config.build_settings['EXCLUDED_ARCHS[sdk=iphonesimulator*]'] = 'arm64' # 发布构建阶段关闭不必要的签名校验 if config.build_settings['CONFIGURATION'] == 'Release' config.build_settings['CODE_SIGNING_ALLOWED'] = 'NO' config.build_settings['CODE_SIGNING_REQUIRED'] = 'NO' end end end end
- 第三步:调整CircleCI配置,在执行Fastlane构建前添加缓存清理命令,避免旧版Xcode的衍生数据冲突:
- run: name: 清理Xcode遗留缓存 command: | rm -rf ~/Library/Developer/Xcode/DerivedData xcodebuild clean -workspace ios/Runner.xcworkspace -scheme Development -configuration Release
- 第四步:给Fastlane的build_app方法添加适配参数,跳过不必要的校验:
build_app( workspace: "ios/Runner.xcworkspace", scheme: "Development", export_method: "ad-hoc", # 新增Xcode 13适配参数 build_settings: { "CODE_SIGNING_REQUIRED" => "NO", "CODE_SIGNING_ALLOWED" => "NO" }, use_system_scm: true )
如果以上步骤执行后仍然报错,可以在Run Script的第一行添加set -x,开启脚本执行的详细日志输出,就能定位到脚本内具体失败的执行步骤。
内容的提问来源于stack exchange,提问作者Harol
相关产品推荐
相关产品推荐

