能否在构建时动态修改Flutter版本并推送双正式版至App Store Connect?
实现Flutter应用向App Store Connect推送两个同代码正式版本的方案
针对你需要在master分支推送时,自动向App Store Connect上传两个技术完全一致、仅版本号不同的正式生产版本的需求,以下是基于Fastlane、Codemagic的可行方案,同时说明Flavor的适用性:
一、Fastlane 实现方案
Fastlane是最灵活的实现方式,通过编排lane可以轻松完成两次打包上传流程:
- 编写Fastfile配置:定义一个主lane,内部调用两个子lane分别处理正式版和备份版的打包上传
- 子lane核心操作:
- 用Flutter打包命令指定版本号和构建号:
# 正式版打包 flutter build ios --release --build-name=3.5.0 --build-number=100 # 备份版打包 flutter build ios --release --build-name=4.0.0 --build-number=101 - 调用
upload_to_app_storeaction分别上传两个IPA包,注意两个版本的build-number必须唯一,避免App Store Connect校验报错
- 用Flutter打包命令指定版本号和构建号:
- 自动化触发:在GitHub Actions、GitLab CI等工具中配置规则,当master分支推送时自动执行Fastlane的主lane
二、Codemagic 实现方案
Codemagic作为Flutter专属CI/CD工具,有两种实现方式:
- 多工作流配置:
- 创建两个独立的工作流,均设置为master分支推送时触发
- 分别在两个工作流的「Build arguments」中指定不同的版本号和构建号,比如正式版填
--build-name=3.5.0 --build-number=100,备份版填--build-name=4.0.0 --build-number=101 - 开启「Publish to App Store Connect」选项,选择Production环境即可自动上传
- 单工作流多任务:
- 在单个工作流的脚本步骤中,依次执行两次打包上传命令:
# 正式版打包上传 flutter build ios --release --build-name=3.5.0 --build-number=100 xcrun altool --upload-app --type ios --file build/ios/iphoneos/Runner.ipa --username $APP_STORE_USERNAME --password $APP_STORE_PASSWORD # 备份版打包上传 flutter build ios --release --build-name=4.0.0 --build-number=101 xcrun altool --upload-app --type ios --file build/ios/iphoneos/Runner.ipa --username $APP_STORE_USERNAME --password $APP_STORE_PASSWORD - 注意提前在Codemagic环境变量中配置好Apple账号的用户名和专用密码
- 在单个工作流的脚本步骤中,依次执行两次打包上传命令:
三、Flavor 是否适用?
Flavor的设计初衷是区分同一代码的不同功能变体(如免费/付费版、不同地区版本),通常会搭配不同的bundle ID或配置文件。你的需求是完全相同的代码仅版本号不同,使用Flavor反而会增加不必要的配置复杂度(比如要为两个Flavor维护重复的配置),因此不推荐用Flavor实现该需求。
关键注意点
- 版本号规则:App Store Connect要求同一bundle ID下的每个构建的
build-number必须唯一,所以两次打包的build-number必须递增(如100、101),版本号可以是任意合理的数值(如3.5.0、4.0.0) - 代码一致性:确保两次打包使用的是同一分支的最新代码,CI流程中先拉取代码再执行打包操作,避免中间出现代码变更
- 权限配置:无论是Fastlane还是Codemagic,都需要配置好Apple开发者账号的权限,确保有权限向App Store Connect上传生产版本
内容的提问来源于stack exchange,提问作者Yuki
相关产品推荐
相关产品推荐

