Kotlin Multiplatform 中 iOS 应用程序的不同架构

Posted

技术标签:

【中文标题】Kotlin Multiplatform 中 iOS 应用程序的不同架构【英文标题】:Different Schema for iOS App in Kotlin Multiplatform 【发布时间】:2021-04-13 21:12:18 【问题描述】:

我正在开发一个 KMM 项目,我需要为我的项目创建不同的模式,例如(开发、生产、质量保证)我可以在 android 部分轻松完成,但我无法在 ios 中创建相同的模式。我尝试创建通常在 iOS 应用程序中执行的不同模式,但我的应用程序崩溃,错误定位到我们在 android studio 中的packForXcode 任务。

崩溃时出错:- No enum constant org.jetbrains.kotlin.gradle.plugin.mpp.NativeBuildType.DEVELOPMENT 在这里我创建了一个名为 development 的自定义架构

这个错误指向

val packForXcode by tasks.creating(Sync::class) 
group = "build"
val mode = System.getenv("CONFIGURATION") ?: "DEBUG"
val sdkName = System.getenv("SDK_NAME") ?: "iphonesimulator"
val targetName = "ios" + if (sdkName.startsWith("iphoneos")) "Arm64" else "X64"
val framework = kotlin.targets.getByName<KotlinNativeTarget>(targetName).binaries.getFramework(mode)
inputs.property("mode", mode)
dependsOn(framework.linkTask)
val targetDir = File(buildDir, "xcode-frameworks")
from( framework.outputDirectory )
into(targetDir)

现在进入binaries,我可以看到有两个NativeBuildTargetsDEBUGRELEASE,所以我可以在这两个中运行,但是如何为我的iOS 应用创建自定义架构?

【问题讨论】:

【参考方案1】:

问题是由包含"configuration" 值的mode 变量引起的,从Kotlin/Native 编译器的角度来看,这不是一个合适的构建类型(请参阅documentation 中的一些详细信息)。为了避免这种情况,应该重新定义确定modes 值的函数。例如,它可能是这样的:

val mode = if (System.getenv("CONFIGURATION") != "release") "DEBUG" else System.getenv("CONFIGURATION")

【讨论】:

如果我使用kotlin("native.cocoapods") 会怎样,如何重新分配configuration 值? 自定义构建名称和 Cocoapods 插件存在问题。详情请见this issue。【参考方案2】:

下面为我工作


val packForXcode by tasks.creating(Sync::class) 
    group = "build"
    // Below line is important to solve it
    val mode = if (System.getenv("CONFIGURATION") != "release") "DEBUG" else System.getenv("CONFIGURATION")
    val sdkName = System.getenv("SDK_NAME") ?: "iphonesimulator"
    val targetName = "ios" + if (sdkName.startsWith("iphoneos")) "Arm64" else "X64"
    val framework = kotlin.targets.getByName<KotlinNativeTarget>(targetName).binaries.getFramework(mode)
    inputs.property("mode", mode)
    dependsOn(framework.linkTask)
    val targetDir = File(buildDir, "xcode-frameworks")
    from( framework.outputDirectory )
    into(targetDir)


【讨论】:

以上是关于Kotlin Multiplatform 中 iOS 应用程序的不同架构的主要内容,如果未能解决你的问题,请参考以下文章

Kotlin Multiplatform:如何在 iOS 的单元测试中模拟对象

kotlin.native.concurrent.InvalidMutabilityException:在 Kotlin Multiplatform (iOS) 中使用 ktor 时冻结 <ob

Kotlin Multiplatform 中 iOS 应用程序的不同架构

Kotlin Multiplatform Mobile:Ktor - 如何在 Kotlin Native(iOS)中取消活动协程(网络请求、后台工作)?

无法解析 Kotlin Multiplatform 中的 cinterop IOS 导入

在 Kotlin MultiPlatform 项目中未解决 iOS 依赖项