You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Compose Multiplatform iOS端Ktor API调用报TLS会话不支持错误求助

解决Compose Multiplatform中iOS端Ktor API调用的"TLS sessions are not supported on Native platform"错误

问题根源

你遇到的两个问题(iOS TLS错误、Android的NoClassDefFoundError)都和Ktor版本选择错误以及依赖配置不完整直接相关:

  • 你使用的3.0.0-wasm2是Wasm平台专属的预览版本,对iOS(Darwin)平台兼容性极差,会触发底层TLS会话不支持的错误。
  • 切换到2.x稳定版后出现的HttpTimeout类找不到错误,是因为OkHttp引擎依赖该插件,但你未在依赖中声明。

分步解决方案

1. 替换Ktor为稳定版

修改lib.version.toml,将Ktor版本更新为最新稳定版(示例用2.3.12),并补充必要的插件依赖:

[versions]
ktor = "2.3.12"

[libraries]
ktor-client-core = { module = "io.ktor:ktor-client-core", version.ref = "ktor" }
ktor-client-darwin = { module = "io.ktor:ktor-client-darwin", version.ref = "ktor" }
ktor-client-okhttp = { module = "io.ktor:ktor-client-okhttp", version.ref = "ktor" }
# 添加HttpTimeout插件,解决Android端类找不到错误
ktor-client-plugins-timeout = { module = "io.ktor:ktor-client-plugins-http-timeout", version.ref = "ktor" }
ktor-client-content-negotiation = { module = "io.ktor:ktor-client-content-negotiation", version.ref = "ktor" }
ktor-serialization-kotlinx-json = { module = "io.ktor:ktor-serialization-kotlinx-json", version.ref = "ktor" }

2. 修正build.gradle.kts的依赖配置

commonMain只保留跨平台核心依赖,不要添加CIO引擎(让各平台自动使用专属引擎):

sourceSets {
    commonMain.dependencies {
        implementation(libs.ktor.client.core)
        implementation(libs.ktor.client.content.negotiation)
        implementation(libs.ktor.serialization.kotlinx.json)
        implementation(libs.ktor.client.plugins.timeout) // 必须添加,解决Android端错误
    }

    androidMain.dependencies {
        implementation(libs.ktor.client.okhttp)
    }

    iosMain.dependencies {
        implementation(libs.ktor.client.darwin)
    }
}

3. 正确配置HttpClient

不在common代码中强制指定引擎,让Ktor自动根据平台选择对应实现(Android用OkHttp,iOS用Darwin):

val appModule = DI {
    bindSingleton {
        val json = Json { ignoreUnknownKeys = true }
        HttpClient {
            install(ContentNegotiation) {
                json(json, contentType = ContentType.Any)
            }
            // 可选:配置超时,避免因超时引发其他问题
            install(HttpTimeout) {
                requestTimeoutMillis = 15000
                connectTimeoutMillis = 10000
            }
        }
    }
    ...
}

4. 验证API调用代码

确保请求代码逻辑正确,URL和请求头设置合理:

companion object {
    const val BASE_URL = "https://rit.im/x/xxxx-xxx"
}

val result = httpClient.get(BASE_URL) {
    header(HttpHeaders.ContentType, ContentType.Application.Json)
}.body<CustomModel>()

额外注意事项

  • 所有Ktor相关依赖版本必须保持一致,禁止混用预览版和稳定版。
  • 若iOS端仍有TLS问题,可先检查API域名的SSL证书是否合法;测试环境下可临时禁用证书验证(生产环境绝对禁止):
// 仅测试用,生产环境请勿使用
HttpClient(Darwin) {
    engine {
        configureRequest {
            setAllowsAnyHTTPSCertificate(true)
        }
    }
    // 其他配置...
}

内容的提问来源于stack exchange,提问作者murat_yuksektepe

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.21 08:07:33