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
相关产品推荐
相关产品推荐

