Мультиплатформа Kotlin с iOS: «Использование необъявленного типа« KotlinCoroutineContext »» - PullRequest
0 голосов
/ 21 января 2019

Я пытаюсь использовать многоплатформенный код Kotlin (который использует Ktor и Kotlin Coroutines) на iOS.Фреймворк создан правильно и может вызывать некоторые классы / методы, предоставляемые без проблем.Однако, если я попытаюсь добавить следующее (как это сделано в https://github.com/JetBrains/kotlinconf-app/blob/master/konfios/konfswift/ui/UI.swift, например).Я получаю «Использование необъявленного типа KotlinCoroutineContext» (и я вижу в SharedCode.h, что его нет)

import Foundation
import UIKit
import SharedCode


public class CoroutineDispatcher: Kotlinx_coroutines_core_nativeCoroutineScope {
    override public func dispatch(context: KotlinCoroutineContext, block: Kotlinx_coroutines_core_nativeRunnable) {
        DispatchQueue.main.async {
            block.run()
        }
    }
}

Файл Gradle для кода общего ресурса включает следующее (использую Kotlin 1.3.11, Ktor 1.0.1 и Coroutines 1.0.1 вместе с Gradle 4.7)

    commonMain.dependencies {
        implementation "org.jetbrains.kotlin:kotlin-stdlib-common:${Versions.kotlin}"
        implementation "org.jetbrains.kotlinx:kotlinx-coroutines-core-common:${Versions.kotlinCoroutines}"
        implementation "org.jetbrains.kotlinx:kotlinx-serialization-runtime:${Versions.kotlinxSerialization}"

        implementation "io.ktor:ktor-client-core:${Versions.ktor}"
        implementation "io.ktor:ktor-client-json:${Versions.ktor}"

    }

    androidMain.dependencies {
        implementation "org.jetbrains.kotlin:kotlin-stdlib-jdk8:${Versions.kotlin}"
        implementation "org.jetbrains.kotlinx:kotlinx-coroutines-android:${Versions.kotlinCoroutines}"

        implementation "io.ktor:ktor-client-core-jvm:${Versions.ktor}"
        implementation "io.ktor:ktor-client-json-jvm:${Versions.ktor}"
    }

    iOSMain.dependencies {
        implementation "org.jetbrains.kotlinx:kotlinx-coroutines-core-native:${Versions.kotlinCoroutines}"
        implementation "org.jetbrains.kotlinx:kotlinx-serialization-runtime-native:${Versions.kotlinxSerialization}"

        implementation "io.ktor:ktor-client-ios:${Versions.ktor}"
        implementation "io.ktor:ktor-client-core-ios:${Versions.ktor}"
        implementation "io.ktor:ktor-client-json-ios:${Versions.ktor}"
    }

Я подозреваю, что проблема может заключаться в том, что эти символы не отображаются явно (также пытались использовать api вместо implementation длязависимости сопрограмм, но это не помогло).

Это то, что у меня есть до сих пор: https://github.com/joreilly/galway-bus-android/tree/kotlin_native

ОБНОВЛЕНИЕ :

Попробовал недавно выпущенныйKotlin v1.3.20, но теперь получает следующее

> Task :SharedCode:linkMainDebugFrameworkIOS
warning: skipping /Users/jooreill/.gradle/caches/modules-2/files-2.1/io.ktor/ktor-client-ios_debug_ios_x64/1.0.1/7ac4ac71743dbff041cc51a117e1732a9133d3b8/ktor-client-ios.klib. The abi versions don't match. Expected '[5]', found '2'
warning: the compiler versions don't match either. Expected '[1.1.1]', found '1.0.2-release-4769'
error: compilation failed: Could not find "/Users/jooreill/.gradle/caches/modules-2/files-2.1/io.ktor/ktor-client-ios_debug_ios_x64/1.0.1/7ac4ac71743dbff041cc51a117e1732a9133d3b8/ktor-client-ios.klib" in [/Users/jooreill/devroot/github/galway-bus-android/SharedCode, /Users/jooreill/.konan/klib, /Users/jooreill/.konan/kotlin-native-macos-1.1.1/klib/common, /Users/jooreill/.konan/kotlin-native-macos-1.1.1/klib/platform/ios_x64].
``

1 Ответ

0 голосов
/ 02 февраля 2019

У меня была та же проблема в вашем обновлении

The abi versions don't match. Expected '[5]', found '2'1

В основном, с Kotlin 1.3.20, Ktor необходимо обновить до 1.1.2, а затем Gradle 4.10 требуется для использования последней версии Kotlin. Это из-за метаданных Gradle

Перед этим обновлением у меня появилась новая проблема для создания артефакта iOS, касающегося сериализатора Kotlin:

error: compilation failed: Can’t locate polymorphic serializer definition

Чтобы устранить эту проблему, я удалил аннотацию @Serializable из классов и предоставил интерфейс KSerializer отдельно.

...