Ошибка KMM: Этот API является внутренним в ktor и не должен использоваться. Он может быть удален или изменен без предварительного уведомления

#ios #kotlin #kotlin-multiplatform #ktor #xcode13

Вопрос:

После обновления Xcode до 13.0 я не могу запустить свое приложение для iOS, которое использует мультиплатформенную платформу Kotlin.
Сборка завершается с Command PhaseScriptExecution failed with a nonzero exit code ошибкой , и в ней говорится, что ошибка:

Задача :общий доступ:Ошибка
компиляции e: /Пользователи…путь…/KtorClient.kt: (134, 17): Этот API является внутренним в ktor и не должен использоваться. Он может быть удален или изменен без предварительного уведомления.

У нас также были подобные ошибки после обновления до Xcode 13, но это всегда что-то с общей библиотекой KMM, JDK и т.д… Эта ошибка показывалась много раз:
> Process ‘command ‘/Library/Java/JavaVirtualMachines/jdk-11.0.12.jdk/Contents/Home/bin/java’' finished with non-zero exit value 1

134 линия KtorClient.kt :

 override suspend fun createPassword(email: String, password: String): CreatePasswordResponse {
        return client.post {
            url {
                path("v1", "user", "create_password")
                body = LoginRequest(email, password)
            }
            headers {
/*134.line*/    append(HttpHeaders.ContentType, ContentType.Application.Json)
            }
        }
    }
 

Мы попытались удалить XCWorkspace Podfile.lock папку , , Pods, затем переустановить модуль, удалить производные данные, ничего не помогло.

Мы также пробовали разные версии Ktor, JDK, но ничего не помогло.

Также эта команда, найденная в Интернете, не помогла(они говорят, что вы должны запустить ее после обновления Xcode):

 sudo xcode-select --switch /Applications/Xcode.app/Contents/Developer
 

Ответ №1:

Это известная проблема Ktor, связанная с этим исправлением в Котлине.

Вот что говорится в документации:

Обратите внимание, что StringValuesBuilder класс, предоставляющий функцию добавления, неправильно помечен InternalAPI аннотацией. Эта проблема будет исправлена в v2.0.0 . В качестве обходного пути вы можете добавить @OptIn(InternalAPI::class) аннотацию, чтобы явно отказаться от использования этого API.

Вы можете указать свою конкретную строку @OptIn(InternalAPI::class) или добавить ее в свой общий модуль build.gradle.kts , чтобы она вступила в силу для всего модуля:

 kotlin {
    // ..
    sourceSets {
        all {
            languageSettings.optIn("io.ktor.util.InternalAPI")
        }
        // ...
    }
}
 

Комментарии:

1. Это не помогло. Моя текущая версия Gradle-1.6.0-RC.

2. @stackich попробуйте добавить @OptIn(InternalAPI::class) перед строкой 134

3. Привет, @stackich. Мой ответ решил ваш вопрос? Если да, пожалуйста, примите это. В противном случае, дайте мне знать, если у вас возникнут какие-либо проблемы с этим. Я также добавил цитату из документации по этой теме