You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Xcode Cloud工作流中自动设置CFBundleShortVersionString

Xcode Cloud自动化公开部署版本的解决方案

问题背景

用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"

配置步骤:

  1. 打开Xcode,进入「Product > Xcode Cloud > Workflows」
  2. 选择你的公开部署工作流,切换到「Actions」标签
  3. 在「Build」阶段前添加一个「Run Script」动作,把上面的脚本粘贴进去,修改项目路径为实际路径

这个脚本会在Xcode开始构建前执行,直接修改项目配置文件,构建时Xcode会读取修改后的CURRENT_PROJECT_VERSION,从而生成唯一的CFBundleShortVersionString。

方案2:自定义xcodebuild命令传递版本参数

在工作流的构建阶段,不使用默认的Xcode构建动作,改用自定义xcodebuild命令,直接在命令行中传递版本参数。

配置步骤:

  1. 在工作流的「Actions」标签中,删除默认的「Build」动作
  2. 添加「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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.26 05:53:23