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

KMM项目中无法添加CocoaPods插件的问题求助

解决KMP中CocoaPods插件版本冲突问题

我试图在Kotlin Multiplatform项目的build.gradle中配置CocoaPods静态框架,但安装org.jetbrains.kotlin.native.cocoapods插件(版本1.15.2)时遇到以下错误:

Error resolving plugin [id: 'org.jetbrains.kotlin.native.cocoapods',
version: '1.15.2']

The request for this plugin could not be satisfied because the plugin is already on the classpath with an unknown version, so compatibility cannot be checked.

项目的build.gradle代码如下:

import com.codingfeline.buildkonfig.compiler.FieldSpec.Type.STRING

plugins {
  kotlin("multiplatform")
  kotlin("plugin.serialization") version "1.9.23"
  id("org.jetbrains.kotlin.native.cocoapods") version "1.15.2"
  id("com.android.library")
  id("com.google.devtools.ksp") version "1.9.24-1.0.20"
  id("com.squareup.sqldelight")
  id("koin")
  id("com.rickclephas.kmp.nativecoroutines") version "0.13.3"
  id("dev.icerock.moko.kswift") version "0.6.0"
  id("com.codingfeline.buildkonfig") version "+"
  id("io.kotest.multiplatform") version "5.8.0"
  id("org.jetbrains.kotlinx.kover") version "0.7.4"
  id("dev.icerock.mobile.multiplatform-resources")
}

val koinVersion = "3.1.4"

buildkonfig {
  packageName = "id.test.shared"
  objectName = "TestSharedConfig"
  exposeObjectWithName = "TestSharedPublicConfig"

  // default config is required
  defaultConfigs {
    buildConfigField(STRING, "APP_STORE_BASE_URL", "itunes.apple.com")
  }

  defaultConfigs("staging") {
    buildConfigField(STRING, "APP_STORE_BASE_URL", "itunes.apple.com")
  }

  defaultConfigs("production") {
  
    buildConfigField(STRING, "APP_STORE_BASE_URL", "itunes.apple.com")
  }
}

@OptIn(org.jetbrains.kotlin.gradle.ExperimentalKotlinGradlePluginApi::class)
kotlin {
  iosX64()
  iosArm64()
  iosSimulatorArm64()

  targetHierarchy.default()

  androidTarget {
    compilations.all {
      kotlinOptions {
        jvmTarget = JavaVersion.VERSION_17.toString()
      }
    }
  }

  sourceSets {
    commonMain.dependencies {
      implementation("org.jetbrains.kotlinx:kotlinx-serialization-json:1.5.1")
      implementation("org.jetbrains.kotlinx:kotlinx-coroutines-core:1.7.0")
      implementation("org.jetbrains.kotlinx:kotlinx-datetime:0.4.0")
      implementation("io.insert-koin:koin-core:$koinVersion")
      implementation("com.squareup.sqldelight:runtime:1.5.4")

      implementation("io.ktor:ktor-client-core:2.3.0")
      implementation("io.ktor:ktor-client-auth:2.3.0")
      implementation("io.ktor:ktor-client-cio:2.3.0")
      implementation("io.ktor:ktor-client-logging:2.3.0")
      implementation("io.ktor:ktor-client-serialization:2.3.0")
      implementation("io.ktor:ktor-client-encoding:2.3.0")
      implementation("io.ktor:ktor-client-content-negotiation:2.3.0")
      implementation("io.ktor:ktor-serialization-kotlinx-json:2.3.0")

      implementation("com.russhwolf:multiplatform-settings-no-arg:1.0.0-RC")
      implementation("co.touchlab:stately-isolate:1.2.2")

      api("co.touchlab:kermit:1.1.3")
      implementation(kotlin("stdlib-common"))
      implementation("co.touchlab:stately-common:1.2.2")
      implementation("com.badoo.reaktive:reaktive:1.2.2")
      implementation("com.badoo.reaktive:reaktive-annotations:1.2.2")
      implementation("com.badoo.reaktive:coroutines-interop:1.2.2")

      api("dev.icerock.moko:resources:0.24.0-beta-4")
      api("dev.icerock.moko:resources-compose:0.24.0-beta-4") // for compose multiplatform
      implementation("dev.icerock.moko:resources-test:0.24.0-beta-4")

    }

    commonTest.dependencies {
      implementation(kotlin("test"))
      implementation(kotlin("test-common"))
      implementation(kotlin("test-annotations-common"))
      implementation("io.mockative:mockative:2.0.1")
      implementation("org.jetbrains.kotlinx:kotlinx-coroutines-test:1.7.0")
      implementation("io.kotest:kotest-framework-engine:5.8.0")
      runtimeOnly("io.kotest:kotest-framework-api-jvm:5.8.0")
      implementation("io.insert-koin:koin-test:$koinVersion")
      implementation("org.jetbrains.kotlinx:kotlinx-serialization-json:1.5.1")
      implementation("io.ktor:ktor-client-content-negotiation:2.3.0")
      implementation("io.ktor:ktor-serialization-kotlinx-json:2.3.0")
    }

    androidMain.dependencies {
      implementation("com.squareup.sqldelight:android-driver:1.5.4")
      implementation("io.ktor:ktor-client-android:2.3.0")
      implementation("com.squareup.okhttp3:okhttp:4.12.0")
      implementation("com.squareup.okhttp3:logging-interceptor:4.12.0")
      implementation("io.ktor:ktor-client-okhttp:2.3.0")
    }

    iosMain.dependencies {
      implementation("com.squareup.sqldelight:native-driver:1.5.4")
      implementation("io.ktor:ktor-client-ios:2.3.0")
    }
  }
}

// add support for kotlin extension function and sealed class to enum swift
kswift {
  install(dev.icerock.moko.kswift.plugin.feature.SealedToSwiftEnumFeature)
  install(dev.icerock.moko.kswift.plugin.feature.PlatformExtensionFunctionsFeature)
}

android {
  compileSdk = 32
  namespace = "id.Test.shared"
  defaultConfig {
    minSdk = 23
    targetSdk = 32

    testInstrumentationRunner = "androidx.test.runner.AndroidJUnitRunner"

    testInstrumentationRunnerArguments["clearPackageData"] = "true"

    testOptions {
      execution = "ANDROIDX_TEST_ORCHESTRATOR"
    }
  }
  compileOptions {
    sourceCompatibility = JavaVersion.VERSION_17
    targetCompatibility = JavaVersion.VERSION_17
  }

  dependencies {
    androidTestImplementation("androidx.test:runner:1.4.0")
    androidTestUtil("androidx.test:orchestrator:1.4.1")

    debugImplementation("com.github.chuckerteam.chucker:library:3.5.2")
    releaseImplementation("com.github.chuckerteam.chucker:library-no-op:3.5.2")
  }
}

dependencies {
  configurations
    .filter { it.name.startsWith("ksp") && it.name.contains("Test") }
    .forEach {
      add(it.name, "io.mockative:mockative-processor:1.2.6")
    }
}

sqldelight {
  database("TestDB") {
    packageName = "id.Test.shared.cache"
    sourceFolders = listOf("sqldelight")
  }
}

multiplatformResources {
  resourcesPackage.set("id.test.shared")
  resourcesClassName.set("id.test.shared")
}

问题原因

org.jetbrains.kotlin.native.cocoapods是Kotlin Multiplatform插件的内置组件,不需要单独指定版本。你指定的1.15.2版本与当前项目使用的Kotlin版本(从kotlin("plugin.serialization") version "1.9.23"可知为1.9.23)严重不匹配,且KMP插件已经自动引入了该cocoapods组件,导致版本冲突。

修复步骤

  1. 移除CocoaPods插件的版本声明
    在plugins块中,将

    id("org.jetbrains.kotlin.native.cocoapods") version "1.15.2"
    

    修改为:

    id("org.jetbrains.kotlin.native.cocoapods")
    
  2. 统一Kotlin插件版本
    为避免版本不一致问题,建议为所有Kotlin官方插件指定统一版本,在plugins块顶部添加版本声明:

    plugins {
        kotlin("multiplatform") version "1.9.23"
        kotlin("plugin.serialization") version "1.9.23"
        id("org.jetbrains.kotlin.native.cocoapods")
        // 其他插件...
    }
    

    这样所有Kotlin相关插件都会使用1.9.23版本,确保兼容性。

  3. 配置静态CocoaPods框架
    在kotlin块中添加cocoapods配置,启用静态框架:

    kotlin {
        // 已有目标配置...
        
        cocoapods {
            framework {
                isStatic = true // 启用静态框架
                baseName = "TestShared" // 自定义框架名称
            }
            // 可选:补充podspec基础信息
            summary = "Shared KMP framework for Test app"
            homepage = "你的项目主页链接"
        }
    }
    

最终修改后的plugins块示例

plugins {
    kotlin("multiplatform") version "1.9.23"
    kotlin("plugin.serialization") version "1.9.23"
    id("org.jetbrains.kotlin.native.cocoapods")
    id("com.android.library")
    id("com.google.devtools.ksp") version "1.9.24-1.0.20"
    id("com.squareup.sqldelight")
    id("koin")
    id("com.rickclephas.kmp.nativecoroutines") version "0.13.3"
    id("dev.icerock.moko.kswift") version "0.6.0"
    id("com.codingfeline.buildkonfig") version "+"
    id("io.kotest.multiplatform") version "5.8.0"
    id("org.jetbrains.kotlinx.kover") version "0.7.4"
    id("dev.icerock.mobile.multiplatform-resources")
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.24 02:45:55