如何从info.plist更新MARKETING_VERSION和CFBundleVersion?为何修改不生效?
可以直接通过Info.plist文件维护版本号(对应MARKETING_VERSION)和构建号(对应CFBundleVersion),你遇到的不生效问题,主要是Xcode的构建设置优先级逻辑导致的,或者可能修改了错误的plist文件。以下是具体原因和解决方法:
核心原因:Xcode的构建设置覆盖机制
在Xcode 13及以上版本中,MARKETING_VERSION和CFBundleVersion的最终生效值来自Target的Build Settings,而非你手动修改的Info.plist文件。当你通过Target>Info>Custom iOS Target Properties修改时,Xcode会同步更新Build Settings和对应的plist条目,所以修改会生效;但直接修改plist文件时,Build Settings里的固定值会在构建过程中覆盖plist的内容,导致你的修改不生效。
具体解决步骤
确认修改的是Target关联的Info.plist
打开Target的Build Settings面板,搜索Info.plist File,查看其对应的文件路径,确保你手动修改的plist文件和这个路径完全一致。如果修改的是项目根目录的plist而非Target绑定的文件,自然不会生效。调整Build Settings,让其读取plist的值
打开Target的Build Settings,分别搜索MARKETING_VERSION和CFBundleVersion,将它们的值修改为:MARKETING_VERSION:$(INFO_PLIST:CFBundleShortVersionString)CFBundleVersion:$(INFO_PLIST:CFBundleVersion)
这样设置后,Xcode在构建时会读取你手动修改的Info.plist中的对应值,而不会用Build Settings的硬编码值覆盖。
验证修改结果
执行Cmd+Shift+K清理项目,然后重新构建。可以通过以下方式验证:- 在模拟器/真机安装App后,查看App的详情信息
- 在代码中打印
Bundle.main.infoDictionary?["CFBundleShortVersionString"]和Bundle.main.infoDictionary?["CFBundleVersion"],确认输出值和你修改的plist内容一致
内容的提问来源于stack exchange,提问作者Pratik Prajapati

