升级Xcode 13.0后KMM iOS应用编译失败:Ktor内部API使用报错及排查无效求助
解决Xcode 13升级后KMM iOS应用构建失败的问题
你遇到的核心问题其实不是Xcode升级本身,而是Ktor库的API变更——你代码里用的ContentType.Application.Json已经被标记为内部API(internal),不再允许外部直接引用,KMM编译时触发这个合规检查错误,进而导致PhaseScriptExecution失败。下面是针对性的解决步骤:
步骤1:替换废弃的Ktor ContentType API
把你KtorClient.kt第134行的代码:
append(HttpHeaders.ContentType, ContentType.Application.Json)
替换成Ktor官方推荐的公开用法,有两种更安全的写法可选:
写法1:用toString()转换为公开可用的字符串
append(HttpHeaders.ContentType, ContentType.Application.Json.toString())
写法2:用Ktor提供的专用扩展方法(更优雅)
直接替换整个headers块,改用contentType扩展方法:
override suspend fun createPassword(email: String, password: String): CreatePasswordResponse { return client.post { url { path("v1", "user", "create_password") body = LoginRequest(email, password) } // 替代原headers中的append操作 contentType(ContentType.Application.Json) } }
解释:Ktor在新版本中把ContentType.Application.Json的直接实例引用改为内部实现,推荐通过字符串转换或专用方法设置请求头,这样就不会触发internal API的报错。
步骤2:确保Ktor版本与KMM完全兼容
如果你之前更换过Ktor版本但没解决,建议锁定一个稳定的兼容版本(比如目前KMM常用的2.3.3,可根据项目实际情况调整),在shared/build.gradle.kts里统一所有Ktor依赖的版本:
val ktorVersion = "2.3.3" sourceSets { val commonMain by getting { dependencies { implementation("io.ktor:ktor-client-core:$ktorVersion") implementation("io.ktor:ktor-client-content-negotiation:$ktorVersion") implementation("io.ktor:ktor-serialization-kotlinx-json:$ktorVersion") // 其他Ktor相关依赖... } } val iosMain by getting { dependencies { implementation("io.ktor:ktor-client-darwin:$ktorVersion") } } }
注意:所有Ktor依赖的版本必须完全一致,避免版本冲突导致的隐性编译错误。
步骤3:清理缓存并重新构建
完成代码修改和版本确认后,执行以下操作确保缓存完全清理:
- 在项目根目录执行
./gradlew clean,清理KMM的Gradle缓存 - 打开Xcode,通过
Xcode -> Settings -> Locations -> Derived Data删除对应项目的缓存文件夹 - 重新执行
pod install(如果项目使用CocoaPods管理iOS依赖) - 最后尝试重新构建运行应用
为什么之前的方案没生效?
你之前尝试的删除XCWorkspace、Pods、Derived Data等操作,都是解决Xcode缓存或依赖同步问题,但这次的核心错误是Ktor代码本身违反了API使用规范,必须先修复代码,再配合清理缓存才能彻底解决问题。
内容的提问来源于stack exchange,提问作者stackich
相关产品推荐
相关产品推荐

