Kotlin Multiplatform:如何自动将版本写入iOS的Info.plist?
自动将KMM项目版本写入iOS Info.plist的方法
当然可以实现,以下是几种可靠的方案:
方案一:通过KMM iOS框架配置直接注入版本
在项目根目录或模块的build.gradle.kts中,针对iOS目标的framework配置直接设置Info.plist的版本字段:
kotlin { ios { binaries.framework { baseName = "YourFrameworkName" // 替换成你的框架名称 // 配置Info.plist的版本项 infoPlist { // 显示给用户的版本号(对应CFBundleShortVersionString) setProperty("CFBundleShortVersionString", project.version) // 内部构建版本号(对应CFBundleVersion,可与上面一致或单独设置) setProperty("CFBundleVersion", project.version) } } } // 其他平台配置... }
执行assembleXcFramework后,生成的框架Info.plist会自动填充你设置的version = "1.1.9"。
方案二:基于自定义Info.plist模板替换占位符
如果需要自定义Info.plist的其他内容,可以先创建模板文件:
- 在模块的
src/iosMain/resources/下创建Info.plist模板,加入版本占位符:
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd"> <plist version="1.0"> <dict> <key>CFBundleShortVersionString</key> <string>APP_VERSION</string> <key>CFBundleVersion</key> <string>BUILD_VERSION</string> <!-- 其他必填字段(如CFBundleIdentifier等) --> </dict> </plist>
- 在
build.gradle.kts中读取模板并替换占位符:
kotlin { ios { binaries.framework { baseName = "YourFrameworkName" infoPlist = file("src/iosMain/resources/Info.plist").readText() .replace("APP_VERSION", project.version.toString()) .replace("BUILD_VERSION", project.version.toString()) } } }
方案三:通过Gradle任务修改已生成的Info.plist
如果需要在构建完成后统一修改XCFramework中的所有Info.plist,可以添加Gradle任务:
tasks.named("assembleXcFramework") { doLast { val xcFrameworkDir = layout.buildDirectory.dir("xcframeworks/YourFrameworkName.xcframework").get().asFile // 遍历XCFramework下所有的Info.plist文件 xcFrameworkDir.walk().filter { it.name == "Info.plist" }.forEach { plistFile -> // 使用macOS自带的PlistBuddy工具修改版本 exec { commandLine( "/usr/libexec/PlistBuddy", "-c", "Set :CFBundleShortVersionString ${project.version}", plistFile.absolutePath ) } exec { commandLine( "/usr/libexec/PlistBuddy", "-c", "Set :CFBundleVersion ${project.version}", plistFile.absolutePath ) } } } }
注意事项
- 确保
project.version的格式符合Apple版本号规范(如x.y.z,无特殊字符) - 如果需要区分显示版本和构建版本,可以将
CFBundleVersion设置为单独的构建号(比如结合Git提交次数、时间戳等) - 执行
assembleXcFramework前,建议先执行clean任务避免缓存影响
内容的提问来源于stack exchange,提问作者Patrick_K
相关产品推荐
相关产品推荐

