iOS多target如何引用主target的Plist实现版本号与build号统一管理
多Target统一版本号与Build号实现方案
你提到的两种思路中,跨Target引用plist获取版本值的方案完全可行,通过AppDelegate运行时修改版本值的方案不可行——Info.plist的版本字段是安装包签名时就固化的内容,应用运行时对bundle目录只有读权限,修改会导致签名校验失败、应用崩溃,也无法通过App Store审核。
以下是两种可落地的实现方案:
方案1:项目级全局配置管理(最常用,轻量无侵入)
这个方案只需要配置一次,后续改版本号只需要改1个地方,所有Target自动同步:
- 打开Xcode,选中左侧导航栏的项目根节点,切换到项目级别的「Build Settings」标签(注意不要选中下方任意单个Target)
- 点击页面右上角的+号,选择「Add User-Defined Setting」,新增两个自定义配置项:
APP_MARKETING_VERSION:填写对外的版本号,例如1.3.2APP_BUILD_NUMBER:填写内部Build号,例如456
- 逐个选中所有Target,同样进入「Build Settings」标签,搜索
Versioning分组:- 把「Marketing Version」的值改为
$(APP_MARKETING_VERSION) - 把「Current Project Version」的值改为
$(APP_BUILD_NUMBER)
- 把「Marketing Version」的值改为
- 检查所有Target的Info.plist,确认两个版本字段的默认值没有被手动写死:
CFBundleShortVersionString(对应Version)的值应为$(MARKETING_VERSION)CFBundleVersion(对应Build号)的值应为$(CURRENT_PROJECT_VERSION)
(Xcode 11及以上版本默认就是这个配置,无需额外修改)
后续更新版本时,只需要修改项目级别的两个自定义配置项,所有Target构建、归档时会自动读取统一的版本值,不需要逐个修改plist。
方案2:构建脚本自动更新(适合需要自动生成Build号的场景)
如果需要每次归档自动绑定Git提交号、时间戳作为Build号,不需要手动修改配置,可以用构建脚本批量更新:
- 选中任意Target,切换到「Build Phases」标签,点击左上角+号,选择「New Run Script Phase」
- 把新增的脚本阶段拖到「Compile Sources」阶段之前,所有Target都要添加这个脚本阶段,脚本内容参考:
# 示例:取Git最新短提交号作为Build号 BUILD_NUM=$(git rev-parse --short HEAD) # 统一设置所有Target的版本号,1.3.2可替换为你需要的固定版本号,也可以从外部配置文件读取 VERSION_NUM="1.3.2" # 批量更新所有Target的Info.plist的版本字段 find "${PROJECT_DIR}" -name "Info.plist" -path "*${PROJECT_NAME}*" | while read plist_path; do /usr/libexec/PlistBuddy -c "Set :CFBundleShortVersionString ${VERSION_NUM}" "${plist_path}" /usr/libexec/PlistBuddy -c "Set :CFBundleVersion ${BUILD_NUM}" "${plist_path}" done
- 勾选脚本下方的「Based on dependency analysis」选项,避免无变更时重复执行拖慢构建速度。
内容的提问来源于stack exchange,提问作者Anthony Taylor
相关产品推荐
相关产品推荐

