iOS SwiftUI项目自动递增Build版本号失败求助
核心问题根源
Xcode中CURRENT_PROJECT_VERSION才是Build号的权威数据源,Info.plist里的CFBundleVersion只是读取该值的"镜像字段"——它默认绑定$(CURRENT_PROJECT_VERSION)变量,本身不存储实际值。你之前的操作要么改了镜像(Info.plist),要么没正确触达真正的数据源(xcodeproj里的CURRENT_PROJECT_VERSION配置),所以全部无效。
你之前操作失效的具体原因
1. 直接修改Info.plist
Info.plist的CFBundleVersion如果是变量绑定状态,手动硬编码修改后,下次Build时会被CURRENT_PROJECT_VERSION的值覆盖;就算你改成固定值,也只是修改了打包时的临时镜像,根本没更新项目核心配置里的Build号,自然无法实现"自动递增"的持久效果。
2. Build Phase脚本无效
- 脚本方向错了:很多教程里的脚本只修改Info.plist,没碰CURRENT_PROJECT_VERSION,等于做无用功;
- 漏开版本控制开关:用
agvtool的脚本需要先把项目的Versioning System设为Apple Generic,否则agvtool无法识别项目的版本配置; - 脚本时机/路径错误:脚本没放在正确的执行阶段(比如要在Info.plist被处理前执行),或者没指定正确的xcodeproj/target路径,导致修改失败。
3. .xcconfig配置无效
- 未关联target:创建xcconfig后,必须在
Project -> Info -> Configurations中为对应target的Debug/Release环境绑定该xcconfig,否则配置不会生效; - xcconfig本身无法实现递增:xcconfig是静态配置文件,只能设置固定值,不能做
+1这类动态运算,要自动递增必须结合脚本。
正确的实现步骤
1. 开启Apple Generic版本控制
打开项目文件 -> 选中Project根节点 -> 切换到Build Settings标签 -> 搜索Versioning System,设置为Apple Generic;同时把Current Project Version设为初始值(比如1)。
2. 添加Run Script实现自动递增
添加一个Run Script Build Phase(或Xcode 14+直接用Pre-build Action),放在所有Build Phase的最前面(确保在Info.plist处理前执行),脚本二选一:
方案一:用agvtool(官方工具)
agvtool next-version -all
注:agvtool会自动递增所有target的CURRENT_PROJECT_VERSION,前提是你已经开启了Apple Generic版本控制
方案二:手动修改(无需agvtool)
# 替换为你的项目和target名称 PROJECT_NAME="YourProject.xcodeproj" TARGET_NAME="YourTarget" # 获取当前Build号 CURRENT_BUILD=$(xcodebuild -showBuildSettings -project "$PROJECT_NAME" -target "$TARGET_NAME" | grep CURRENT_PROJECT_VERSION | awk '{print $3}') # 计算新Build号 NEW_BUILD=$((CURRENT_BUILD + 1)) # 更新项目配置 xcodebuild -project "$PROJECT_NAME" -target "$TARGET_NAME" CURRENT_PROJECT_VERSION="$NEW_BUILD"
3. 验证Info.plist绑定
打开Info.plist,确认CFBundleVersion的值为$(CURRENT_PROJECT_VERSION),确保每次CURRENT_PROJECT_VERSION更新时,Info.plist会自动同步。
注意事项
- 如果你用CocoaPods,主target的版本设置会自动传递给Pods target,无需额外配置;
- 不要手动修改Info.plist的
CFBundleVersion,保持变量绑定状态,避免被覆盖; - 脚本执行时要确保Xcode有足够权限修改xcodeproj文件,不要用只读模式打开项目。
内容的提问来源于stack exchange,提问作者Captain Save A Hoe

