Swift中实现共享模块外KMP接口遇配置问题求助
问题
我有一个名为session-jwt-public的KMP模块,提供以下Kotlin接口与数据类:
public interface JWTHandler { public fun decode(token: String): JwtDecodedResultWrapper } public data class JwtDecodedResultWrapper( val name: String, val email: String, val role: String, val sub: String )
已在共享模块中通过commonMainImplementation(projects.sessionJwtPublic)引入该模块依赖,共享模块的Gradle二进制配置如下:
// gradle kotlin { listOf( iosArm64(), iosSimulatorArm64(), ).forEach { iosTarget -> iosTarget.binaries.framework { baseName = "MyApp" isStatic = true } } }
尝试在Swift中编写类实现该接口:
public final class JWTSwiftWrapped: JWTHandler { public func decode(token: String) -> JwtDecodedResultWrapper { /// decode here } }
但出现报错:Cannot find type 'JWTHandler' in scope。若将接口移至共享模块则可正常运行。session-jwt-public模块的build.gradle配置如下:
plugins { id("my.conversion.plugin") } dependencies { commonMainImplementation(libs.kotlinx.coroutines.core) commonMainImplementation(libs.kotlinx.serialization.json) } android { namespace = "...." }
请问是否遗漏了某些配置?我希望在独立模块中实现该接口,遵循项目模块结构并学习Swift实现Kotlin接口的方法。
解决方案
你遗漏了KMP模块针对iOS平台的二进制暴露配置,以及共享模块对iOS目标的依赖传递配置,具体需要做以下调整:
1. 配置session-jwt-public模块的iOS二进制输出
在session-jwt-public模块的build.gradle(或build.gradle.kts)中添加Kotlin多平台配置,明确iOS目标并生成可被共享模块引用的框架:
plugins { id("my.conversion.plugin") // 确保应用Kotlin多平台插件,若自定义插件已包含可省略 id("org.jetbrains.kotlin.multiplatform") } kotlin { // 声明iOS目标 iosArm64() iosSimulatorArm64() sourceSets { commonMain.dependencies { implementation(libs.kotlinx.coroutines.core) implementation(libs.kotlinx.serialization.json) } } // 为iOS目标生成静态框架(与共享模块保持一致) listOf(iosArm64(), iosSimulatorArm64()).forEach { target -> target.binaries.framework { baseName = "SessionJWTPublic" isStatic = true } } } android { namespace = "...." }
2. 确保共享模块的iOS框架传递依赖符号
在共享模块的build.gradle中,开启依赖传递导出,让Swift代码能访问session-jwt-public的类型:
kotlin { listOf(iosArm64(), iosSimulatorArm64()).forEach { iosTarget -> iosTarget.binaries.framework { baseName = "MyApp" isStatic = true // 传递导出所有依赖框架,让子模块类型暴露给Swift transitiveExport = true } } sourceSets { commonMain.dependencies { implementation(projects.sessionJwtPublic) } } }
3. 清理并重新构建
- 执行
./gradlew clean清理旧构建产物 - 重新构建所有模块
- 若使用Xcode开发iOS端,同步Gradle配置后重启Xcode
调整完成后,Swift代码即可找到JWTHandler与JwtDecodedResultWrapper类型,正常实现Kotlin接口。
内容的提问来源于stack exchange,提问作者Caique Oliveira
相关产品推荐
相关产品推荐

