如何在Xcode Cloud工作流中自动设置CFBundleShortVersionString
问题背景
用Xcode Cloud构建部署到App Store Connect时,TestFlight构建能自动更新构建号,流程顺畅,但部署公开版本时,归档步骤会弹出「Invalid Pre-Release Train」错误,提示“版本火车‘5.0.26’已关闭,无法提交新构建”。这意味着每次公开部署都得手动递增CFBundleShortVersionString,完全违背了自动化构建的初衷。
当前我在Info.plist里设置了:
<key>CFBundleShortVersionString</key> <string>$(MARKETING_VERSION).$(CURRENT_PROJECT_VERSION)</string>
这样能生成类似5.0.27的版本号,但CURRENT_PROJECT_VERSION需要手动修改project.pbxproj文件,还是没法自动化。之前尝试在工作流环境变量里把CURRENT_PROJECT_VERSION设为$(CI_BUILD_NUMBER),但完全没效果,推测是时机不对,或者Xcode Cloud解析project.pbxproj时不读取环境变量。
可行的Xcode Cloud专属解决方案
方案1:预构建脚本修改project.pbxproj
在Xcode Cloud工作流中添加预构建脚本,直接修改项目文件里的CURRENT_PROJECT_VERSION为Xcode Cloud自带的CI_BUILD_NUMBER(全局唯一递增的构建编号)。
脚本示例:
# 替换成你的项目文件路径 PROJECT_PATH="./YourApp.xcodeproj/project.pbxproj" # 替换CURRENT_PROJECT_VERSION值为CI_BUILD_NUMBER sed -i '' "s/CURRENT_PROJECT_VERSION = .*;/CURRENT_PROJECT_VERSION = $CI_BUILD_NUMBER;/" "$PROJECT_PATH"
配置步骤:
- 打开Xcode,进入「Product > Xcode Cloud > Workflows」
- 选择你的公开部署工作流,切换到「Actions」标签
- 在「Build」阶段前添加一个「Run Script」动作,把上面的脚本粘贴进去,修改项目路径为实际路径
这个脚本会在Xcode开始构建前执行,直接修改项目配置文件,构建时Xcode会读取修改后的CURRENT_PROJECT_VERSION,从而生成唯一的CFBundleShortVersionString。
方案2:自定义xcodebuild命令传递版本参数
在工作流的构建阶段,不使用默认的Xcode构建动作,改用自定义xcodebuild命令,直接在命令行中传递版本参数。
配置步骤:
- 在工作流的「Actions」标签中,删除默认的「Build」动作
- 添加「Run Script」动作,输入以下命令(替换成你的项目、Scheme名称):
xcodebuild archive \ -project YourApp.xcodeproj \ -scheme YourProductionScheme \ -configuration Release \ -archivePath build/YourApp.xcarchive \ MARKETING_VERSION=5.0 \ CURRENT_PROJECT_VERSION=$CI_BUILD_NUMBER
这种方式不需要修改Info.plist或project.pbxproj,直接在构建时覆盖版本参数,Xcode会自动把$(MARKETING_VERSION).$(CURRENT_PROJECT_VERSION)解析成5.0.xxx(xxx为CI_BUILD_NUMBER)。
方案3:结合agvtool管理版本(若启用自动版本管理)
如果你的项目已经开启了「Automatically manage version and build number」(在项目设置的「General」标签),可以用agvtool在预构建脚本中直接设置版本:
# 设置构建号为CI_BUILD_NUMBER agvtool new-version -all $CI_BUILD_NUMBER # 设置市场版本号为固定主版本+CI_BUILD_NUMBER agvtool new-marketing-version "5.0.$CI_BUILD_NUMBER"
这个脚本会自动更新项目的版本配置,适合已经用agvtool管理版本的项目。
注意事项
CI_BUILD_NUMBER是Xcode Cloud全局唯一的递增编号,每个工作流的每次构建都会加1,确保版本号不会重复- 测试脚本时,可以在本地终端设置环境变量
export CI_BUILD_NUMBER=123,然后运行脚本验证修改是否正确 - Xcode Cloud的构建环境是临时的,脚本对项目文件的修改不会提交到远程仓库,不会影响代码库
内容的提问来源于stack exchange,提问作者Tim

