Xcode 13下agvtool new-marketing-version失效的解决方法咨询
Xcode 13 调整了 Info.plist 生成逻辑:默认配置下,版本号、Bundle ID 这类基础字段不再静态存储在独立 Info.plist 文件中,而是直接保存在工程文件project.pbxproj的构建设置项里,编译阶段才会动态生成最终的 Info.plist 内容。手动往 Info.plist 添加静态CFBundleShortVersionString键的做法本身就不符合新版Xcode的设计逻辑——每次在target的Info标签页修改配置时,Xcode会按照当前配置重新同步Info.plist模板,手动添加的键会被直接清除,这就是agvtool命令失效的核心原因。
方案1:适配新版Xcode机制,正常使用agvtool
按照以下步骤配置后,agvtool会直接修改工程文件里的版本配置,不需要依赖Info.plist里的静态键,也不会被Xcode的同步逻辑覆盖:
- 打开项目,进入对应target的Build Settings页,找到
Versioning分组:- 将
Versioning System的值设置为Apple Generic(默认通常为None,必须手动修改) - 给
Current Project Version设置初始值,首次配置填1即可
- 将
- 切到target的Info标签页,找到
Bundle versions string, short(对外展示版本号)和Bundle version(内部构建号)两个条目,确保它们的值分别为$(MARKETING_VERSION)和$(CURRENT_PROJECT_VERSION),不要写死固定字符串 - 如果项目因为需要配置自定义字段单独添加了Info.plist文件,打开这个文件,把
CFBundleShortVersionString和CFBundleVersion两个键的值也改成上述变量引用形式,不要写死固定值,同时确认Build Settings里的INFOPLIST_FILE路径指向你自定义的plist文件即可
配置完成后,原有Jenkins脚本就可以正常生效:
# 设置对外版本号 xcrun agvtool new-marketing-version 1.0.0 # 设置内部构建号(按需使用) xcrun agvtool new-version -all 10
执行后可以用以下命令校验配置是否正确写入:
# 查看当前配置的对外版本号 xcrun agvtool what-marketing-version # 查看当前配置的内部构建号 xcrun agvtool what-version
后续不管怎么在Info标签页修改其他配置,版本号配置都会保存在工程构建设置里,不会被清除。
方案2:不依赖agvtool,直接通过命令行修改工程配置
如果不想调整agvtool相关配置,也可以直接用xcodebuild命令修改工程里的版本配置,本质和新版agvtool逻辑一致,都是直接修改project.pbxproj里的构建设置:
# 替换为实际的项目路径、target名、版本号即可 xcodebuild -project YourProject.xcodeproj \ -target YourTargetName \ MARKETING_VERSION=1.0.0 \ CURRENT_PROJECT_VERSION=10 \ -configuration Release
如果是用CocoaPods的workspace项目,把-project参数替换为-workspace YourWorkspace.xcworkspace,加上-scheme YourSchemeName参数即可。
- 不要手动往Info.plist里写死
CFBundleShortVersionString和CFBundleVersion的固定值,否则会出现构建设置和plist值不一致、配置被覆盖的问题 - 执行版本相关命令时,确保终端当前工作目录在.xcodeproj/.xcworkspace所在的根目录,否则会出现找不到项目的报错
- 如果项目有多个target,执行agvtool命令时加
-all参数可以给所有target统一设置版本号,避免漏改
内容的提问来源于stack exchange,提问作者mrfour

