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
,我可以看到有两个NativeBuildTargets
DEBUG
和RELEASE
,所以我可以在这两个中运行,但是如何为我的iOS 应用创建自定义架构?
【问题讨论】:
【参考方案1】:问题是由包含"configuration"
值的mode
变量引起的,从Kotlin/Native 编译器的角度来看,这不是一个合适的构建类型(请参阅documentation 中的一些详细信息)。为了避免这种情况,应该重新定义确定mode
s 值的函数。例如,它可能是这样的:
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)中取消活动协程(网络请求、后台工作)?