首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Kotlin多平台项目

Kotlin多平台项目
EN

Stack Overflow用户
提问于 2020-05-19 21:43:08
回答 1查看 404关注 0票数 1

我想用Kotin multiplatform写一个可以在androidios上使用的通用库。这个库对于每个平台都有依赖项,例如:在android上我想添加jsoup作为依赖项,在ios上我想添加swiftsoup

对于android来说,添加java库作为依赖项是相当容易的,但是对于ios,我找不到方法。

问题是:如何将swift库作为依赖项添加到此ios项目中

或者有人能给我举一个正在工作的项目作为例子?我在网上找不到任何可以解决我的问题的东西。

代码语言:javascript
复制
build.gradle.kts :

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

    val serializationVersion = "0.20.0"
    val kotlinVersion = "1.3.72"

    plugins {
        kotlin("multiplatform") version kotlinVersion
        kotlin("plugin.serialization") version kotlinVersion
    }

    buildscript {
        dependencies {
            classpath("org.jetbrains.kotlin:kotlin-serialization:$kotlinVersion")
        }
    }

    repositories {
        jcenter()
        mavenCentral()
    }

    kotlin {
        //select iOS target platform depending on the Xcode environment variables
        val iOSTarget: (String, KotlinNativeTarget.() -> Unit) -> KotlinNativeTarget =
                if (System.getenv("SDK_NAME")?.startsWith("iphoneos") == true)
                    ::iosArm64
                else
                    ::iosX64

        iOSTarget("ios") {
            binaries {
                framework {
                    baseName = "SharedCode"
                }
            }
        }

        jvm("android")

        sourceSets["commonMain"].dependencies {
            implementation("org.jetbrains.kotlin:kotlin-stdlib-common")
            implementation("org.jetbrains.kotlinx:kotlinx-serialization-runtime-common:$serializationVersion")
        }

        sourceSets["androidMain"].dependencies {
            implementation("org.jetbrains.kotlin:kotlin-stdlib")
            implementation("org.jsoup:jsoup:1.13.1")
            implementation("org.jetbrains.kotlinx:kotlinx-serialization-runtime:$serializationVersion")
        }

        sourceSets["iosMain"].dependencies {
            implementation("org.jetbrains.kotlinx:kotlinx-serialization-runtime-native:$serializationVersion")
        }

    }

    val packForXcode by tasks.creating(Sync::class) {
        group = "build"

        //selecting the right configuration for the iOS framework depending on the Xcode environment variables
        val mode = System.getenv("CONFIGURATION") ?: "DEBUG"
        val framework = kotlin.targets.getByName<KotlinNativeTarget>("ios").binaries.getFramework(mode)

        inputs.property("mode", mode)
        dependsOn(framework.linkTask)

        val targetDir = File(buildDir, "xcode-frameworks")
        from({ framework.outputDirectory })
        into(targetDir)

        doLast {
            val gradlew = File(targetDir, "gradlew")
            gradlew.writeText("#!/bin/bash\nexport 'JAVA_HOME=${System.getProperty("java.home")}'\ncd '${rootProject.rootDir}'\n./gradlew \$@\n")
            gradlew.setExecutable(true)
        }
    }

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

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-05-19 22:06:16

您不能在Kotlin中使用Swift依赖项,除非它们与Objective-C兼容。如果您想要直接与它们对话,则需要使用cinterop指向它们。或者,您可以在Kotlin中创建接口,或者采用由Swift代码实现的lambdas,并避免cinterop。

https://kotlinlang.org/docs/reference/native/objc_interop.html

我们在一个示例应用程序中传入了很多实现:https://github.com/touchlab/DroidconKotlin/blob/master/iosApp/iosApp/app/AppDelegate.swift#L33

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/61892569

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档