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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.30 00:35:15