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

KMM项目使用PopKorn依赖注入iOS端无法识别@Injectable注解如何解决

KMM项目PopKorn依赖注入iOS端失效解决方案
  • kapt仅支持JVM/Android平台,无法在Kotlin/Native(iOS编译链)中运行,你当前仅配置了全局kapt依赖,只有Android编译时会触发注解处理器生成Provider类,iOS构建时完全没有运行注解处理流程,因此找不到对应类的Provider。

1. 项目添加KSP插件支持

KSP(Kotlin Symbol Processing)是Kotlin官方推出的注解处理工具,支持全KMP平台,替代kapt实现跨平台注解处理。
在项目根目录build.gradle.kts中添加KSP插件依赖,版本需与你项目使用的Kotlin版本严格一致:

plugins {
    id("com.android.application") version "你的AGP版本" apply false
    id("org.jetbrains.kotlin.android") version "你的Kotlin版本" apply false
    id("org.jetbrains.kotlin.multiplatform") version "你的Kotlin版本" apply false
    // 新增KSP插件,版本和Kotlin版本完全匹配
    id("com.google.devtools.ksp") version "你的Kotlin版本" apply false
}

2. 修改shared模块构建配置

修改shared/build.gradle.kts:

plugins {
    id("com.android.library")
    id("org.jetbrains.kotlin.multiplatform")
    // 引入KSP插件
    id("com.google.devtools.ksp")
}

kotlin {
    // 你的原有目标配置
    android()
    iosX64()
    iosArm64()
    iosSimulatorArm64()

    ios {
        binaries.framework {
            baseName = "shared"
            // 导出popkorn依赖,iOS端才能访问框架内的注解生成类
            export("cc.popkorn:popkorn:2.1.1")
        }
    }

    sourceSets {
        val commonMain by getting {
            dependencies {
                // 把implementation改成api,配合export使用
                api("cc.popkorn:popkorn:2.1.1")
            }
        }
        // 其余原有配置不变
    }
}

// 删除原有全局kapt配置,替换为多平台KSP配置
dependencies {
    // Android端注解处理器
    add("kspAndroid", "cc.popkorn:popkorn-compiler:2.1.1")
    // iOS各目标平台注解处理器,根据你的项目支持的iOS目标添加
    add("kspIosX64", "cc.popkorn:popkorn-compiler:2.1.1")
    add("kspIosArm64", "cc.popkorn:popkorn-compiler:2.1.1")
    add("kspIosSimulatorArm64", "cc.popkorn:popkorn-compiler:2.1.1")
}

注:修改后androidApp/build.gradle.kts里的popkorn依赖可以删除,因为shared模块已经通过api导出了该依赖,Android端可以直接使用。

3. 修正Bridge方法命名避免关键字冲突

Kotlin的init属于关键字,导出到ObjC/Swift时可能出现命名异常,修改iosMain/Bridge.kt的方法名:

// 原来的init改成initPopkorn
fun initPopkorn(creator: (ObjCClass) -> Mapping) = cc.popkorn.setup(creator)

fun getInjector() = InjectorObjC(popKorn())

对应的iOS初始化代码同步修改:

@main
struct iOSApp: App {
    init() {
        // 改成调用initPopkorn
        BridgeKt.initPopkorn { (clazz) -> PopkornMapping in
            return clazz.alloc() as! PopkornMapping
        }
    }
    // 其余原有代码不变
}

4. 清理缓存重新构建

执行以下命令清理旧构建产物后重新运行iOS构建:

./gradlew clean

重新构建时即可看到KSP处理PopKorn注解的日志,生成的Provider类会自动包含到iOS的Framework中,报错即可解决。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.03 00:27:03