在 Kotlin Multiplatform Mobile 中查找应用程序版本代码

Find application version code in Kotlin Multiplatform Moblie

我想在 Kmm 中查找应用程序版本代码。在特定平台即

Android

var versionCode = BuildConfig.VERSION_CODE

会return1.1

iOS

let appVersion = "iOS " + (Bundle.main.versionNumber ?? "")

会return1.1

如何在特定平台的 Kmm 中执行操作?

更新

我尝试了 expect/actual 但我遇到了一些错误。

CommonMain

expect class Platform() {
    val versionCode: String
}

iosMain

actual class Platform actual constructor() {
    actual val versionCode =
        platform.Foundation.NSBundle.mainBundle.infoDictionary?.get("CFBundleVersion")
}

iOS 侧错误

android主要

actual class Platform actual constructor() {
    actual val versionCode = BuildConfig.VERSION_CODE
}

android 端出错

KMM 没有对此类功能的一些内置支持。

一个选项是创建一个 expect 函数并在 actual 中为每个平台应用 platform-specific 代码。

我曾经将应用程序版本与模块版本同步,但如果你不能这样做,你可以在你的应用程序模块中创建 Platform 并将其传递给你的公共模块:

共同主线:

expect class Platform { // remove constructor here
    val versionCode: String
}

Android 主要:

actual class Platform(actual val versionCode: String)

然后在应用程序模块中,您只需创建它 Platform(BuildConfig.VERSION_CODE.toString()) 并根据您的架构将其传递到您的共享模块中。


另一种选择是使用 BuildKonfig 插件:它将像 Android 插件一样生成配置文件,具体取决于您在 build.gradle 文件中指定的内容:

buildkonfig {
    packageName = "com.example.app"

    defaultConfigs {
        buildConfigField(STRING, "VERSION_CODE", "1.0")
    }
}

用法:

com.example.app.BuildKonfig.VERSION_CODE

如果您想要 shared module/framework 版本,我只会使用 expect/actual

但是,如果您正在构建 KMM 应用程序,我怀疑您需要的版本是应用程序版本,而不是 shared 模块的版本。

我会选择 AppConfig interface/protocol,例如:

interface AppConfig {
    val version: String
}

然后从您的 androidAppiosApp 中提供 IosAppConfigAndroidAppConfig 实现。