Flutter build ipa报错Encountered error while archiving for device怎么解决
问题根因定位
- 构建阶段复制GoogleService-Info.plist的脚本执行时序/权限问题,首次构建时目标目录未生成导致脚本执行异常但未抛出正确错误码,Xcode判定为构建失败
- 第三方Flutter插件的Pod部署目标与项目全局部署目标不匹配,旧版Flutter(2.2.3)自动生成的Pod配置未统一对齐部署版本
- M1/Intel跨架构构建时,Pod编译缓存与架构匹配逻辑异常,首次构建缓存未生成时触发校验失败
分步修复方案
1. 修复GoogleService-Info.plist复制脚本
该问题是触发Command PhaseScriptExecution错误的核心原因,按以下步骤修改:
打开Xcode,进入项目TARGETS -> Runner -> Build Phases,找到自定义的复制plist脚本,替换为以下内容:
# 按你本地实际的多环境plist路径修改SOURCE路径 INFO_PLIST_SOURCE="${SRCROOT}/Runner/Config/${CONFIGURATION}/GoogleService-Info.plist" INFO_PLIST_DEST="${BUILT_PRODUCTS_DIR}/${PRODUCT_NAME}.app/GoogleService-Info.plist" # 源文件不存在时主动抛出错误,避免异常静默 if [ ! -f "${INFO_PLIST_SOURCE}" ]; then echo "错误:找不到对应环境的GoogleService-Info.plist,路径:${INFO_PLIST_SOURCE}" exit 1 fi # 提前创建目标目录,避免首次构建时目录不存在导致复制失败 mkdir -p "${BUILT_PRODUCTS_DIR}/${PRODUCT_NAME}.app" cp -f "${INFO_PLIST_SOURCE}" "${INFO_PLIST_DEST}"
调整该脚本的执行顺序,拖动到Copy Bundle Resources阶段之后执行。
2. 统一Pod部署目标版本
打开项目ios目录下的Podfile,将开头的platform :ios版本改为与Xcode Runner项目的Deployment Target一致的版本(建议至少设置为11.0,兼容主流第三方插件),然后在Podfile末尾的post_install块添加版本对齐逻辑:
post_install do |installer| installer.pods_project.targets.each do |target| flutter_additional_ios_build_settings(target) # 新增以下配置统一所有Pod的部署目标 target.build_configurations.each do |config| config.build_settings['IPHONEOS_DEPLOYMENT_TARGET'] = '11.0' # 替换为你自己的最低兼容版本 # 兼容M1/Intel跨架构编译问题 config.build_settings['EXCLUDED_ARCHS[sdk=iphonesimulator*]'] = 'arm64' end end end
修改完成后执行以下命令重置Pod依赖:
cd ios rm -rf Pods Podfile.lock ~/Library/Developer/Xcode/DerivedData/* pod deintegrate pod setup pod install --repo-update
如果是M1芯片设备,执行pod install时使用以下命令:
arch -x86_64 pod install --repo-update
3. 标准化构建流程
后续执行归档前按以下顺序执行命令,避免缓存冲突:
flutter clean rm -rf ios/Pods ios/Podfile.lock flutter pub get cd ios && pod install
4. 关闭第三方插件警告(可选)
无需处理的废弃API警告可以直接关闭,在上述post_install块的配置中添加以下两行即可:
config.build_settings['GCC_WARN_INHIBIT_ALL_WARNINGS'] = 'YES' config.build_settings['SWIFT_SUPPRESS_WARNINGS'] = 'YES'
验证修复效果
执行一次完整的flutter clean && flutter pub get && flutter build ios --release,检查首次构建是否成功,拉取Git最新代码后重复操作验证偶发失败问题是否消失。
内容的提问来源于stack exchange,提问作者Niwat Jansutep
相关产品推荐
相关产品推荐

