【问题标题】:Different Schema for iOS App in Kotlin MultiplatformKotlin Multiplatform 中 iOS 应用程序的不同架构
【发布时间】: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 应用创建自定义架构?

【问题讨论】:

    标签: ios xcode kotlin-multiplatform


    【解决方案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)
    }
    
    

    【讨论】:

      猜你喜欢
      • 2021-08-09
      • 1970-01-01
      • 2021-05-13
      • 1970-01-01
      • 2019-05-27
      • 2021-07-29
      • 1970-01-01
      • 2016-10-07
      • 1970-01-01
      相关资源
      最近更新 更多