使用 Kotlin/Native 和 Gradle 中的 Apple 依赖项,更具体地说是 SwiftUI

Use Apple dependencies, more specifically SwiftUI, from Kotlin/Native with Gradle

如何在 Kotlin/Native 或 Kotlin Multiplatform 项目中使用 Gradle 将 Apple 依赖项添加到 Kotlin/Native 模块?

我不熟悉 Apple 和 Xcode 开发——我写了一些 Swift 但还没有为 Xcode 项目配置额外的依赖项,所以请原谅如果我在这里有菜鸟的误解。

Kotlin/Native is interoperable with Objective-C and Swift。在网上浏览的很多示例项目中,Kotlin 被设置为用作 Apple (iOS) 模块的共享库。但它也应该有意义的是,可以从 Kotlin 代码调用 Apple 依赖项中的定义,例如如何将 Java Maven 依赖项添加到 Gradle 构建脚本,然后由 Kotlin 代码调用。

Name Translation section 中说:

platform.* packages for preconfigured system frameworks

在使用 IntelliJ IDEA 中的 Kotlin Multiplatform Mobile Application 选项创建的项目中,此类定义包含在 iosMain 模块的 kotlin 文件夹中的 platform 包下 shared模块。

然而,SwiftUI不存在。更具体地说,就我而言,我正在尝试使用 SwiftUI 在 Kotlin 中直接构建 UIs。目前是否可行,然后如何使 SwiftUI“系统框架”也包含在内?

下面是我在shared模块中的build.gradle.kts供参考:

import org.jetbrains.kotlin.gradle.plugin.mpp.KotlinNativeTarget

plugins {
    kotlin("multiplatform") version "1.4.30"
}

group = "my.group.name"
version = "1.0-SNAPSHOT"

kotlin {
    ios {
        binaries {
            framework {
                baseName = "shared"
            }
        }
    }
    sourceSets {
        val commonMain by getting
        val commonTest by getting {
            dependencies {
                implementation(kotlin("test-common"))
                implementation(kotlin("test-annotations-common"))
            }
        }
        val iosMain by getting
        val iosTest by getting
    }
}

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)
}

tasks.getByName("build").dependsOn(packForXcode)

Kotlin/Native 不与纯 Swift 互操作。来自您链接的文档:

"Kotlin/Native 提供与 Objective-C 的双向互操作性" ... " 如果 API 导出到 Objective-C with @objc.尚不支持纯 Swift 模块."

Swift 可以编写为与 Objc 互操作,使用 @objc Swift 注释,这将对 Swift 代码应用一些约束。纯 Swift,SwiftUI 肯定是,无法导入 Kotlin。

我还建议,即使可能,使用 Kotlin 编码 SwiftUI 可能会是更糟糕的开发体验,因为 Xcode 已经投入了大量工作启用 SwiftUI 预览等。如果对 iOS 的 Kotlin UI 有任何正式的努力,我想这将是对 Compose 的尝试。 JetBrains 可能会在 AppCode 中对 SwiftUI 做出一些努力,但我猜想 SwiftUI + Kotlin 需要很长时间才能实现。 Kotlin/Native 首先需要直接 Swift 互操作,已经讨论过,但据我所知,还没有开始。

总结一下,我会用 Swift 在 Xcode 中编写 SwiftUI 代码,然后与另一个共享的 Kotlin 讨论 [=41]“下方”的逻辑=].