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

M1芯片Xcode编译KMM项目提示embedAndSignAppleFrameworkForXcode任务缺失

问题原因

  • 核心问题是shared模块的iOS目标架构判断逻辑存在缺陷:仅对iOS真机(SDK_NAME前缀为iphoneos)做了iosArm64适配,其余所有场景(包括M1芯片的iOS模拟器)全部默认指定为iosX64目标。
  • 原生运行在M1芯片上的Xcode编译iOS模拟器时,会匹配arm64架构的KMM编译任务,而你的配置中对应场景生成的是x86_64架构的目标,不存在对应架构的embedAndSignAppleFrameworkForXcode任务,因此编译失败。
  • 切换Rosetta模式后Xcode运行在x86_64转译环境下,会匹配x86_64架构的编译任务,刚好和你配置里默认生成的iosX64目标匹配,因此可以编译成功。
  • 你提供的安卓模块配置、JDK版本本身不存在问题,无需修改。

永久解决方法

方案一:修改现有动态判断逻辑(改动最小)

直接替换shared模块中原有iosTarget的判断代码,兼容M1芯片的iOS模拟器arm64架构:

val iosTarget: (String, KotlinNativeTarget.() -> Unit) -> KotlinNativeTarget = when {
    // iOS真机场景
    System.getenv("SDK_NAME")?.startsWith("iphoneos") == true -> ::iosArm64
    // M1芯片的iOS模拟器场景,判断架构为arm64
    System.getenv("ARCHS")?.contains("arm64") == true -> ::iosArm64
    // 其余场景(Intel芯片的模拟器、Rosetta模式下的模拟器)用iosX64
    else -> ::iosX64
}

方案二:使用多目标合并配置(兼容性更强,官方推荐)

直接删除原有动态判断iosTarget的代码,显式声明所有需要支持的iOS目标,Kotlin Gradle插件会自动根据Xcode传入的参数匹配对应编译任务:

kotlin {
    android()
    // 同时声明iOS真机、X64模拟器、Arm64模拟器三类目标
    iosArm64("ios")
    iosX64()
    iosSimulatorArm64()

    // 统一配置所有iOS目标的framework参数
    targets.withType<org.jetbrains.kotlin.gradle.plugin.mpp.KotlinNativeTarget> {
        binaries.withType<org.jetbrains.kotlin.gradle.plugin.mpp.Framework> {
            baseName = "kmm_shared"
        }
        // 保留你原有的编译器参数配置
        compilations.get("main").kotlinOptions.freeCompilerArgs += "-Xexport-kdoc"
        compilations.get("main").kotlinOptions.freeCompilerArgs += "-Xopt-in=kotlin.time.ExperimentalTime"
    }

    sourceSets {
        val commonMain by getting {
            // 你原有commonMain的配置保持不变
            kotlin.srcDir("$buildDir/generated-apis/src/commonMain/kotlin")
            dependencies {
                // 原有依赖保持不变
            }
        }
        val commonTest by getting {
            // 原有commonTest配置保持不变
        }
        val androidMain by getting {
            // 原有androidMain配置保持不变
        }
        val androidTest by getting {
            // 原有androidTest配置保持不变
        }
        // 合并三类iOS目标的源码集
        val iosX64Main by getting
        val iosArm64Main by getting
        val iosSimulatorArm64Main by getting
        val iosMain by creating {
            dependsOn(commonMain)
            iosX64Main.dependsOn(this)
            iosArm64Main.dependsOn(this)
            iosSimulatorArm64Main.dependsOn(this)
            // 原有iosMain的依赖配置挪到此处
            dependencies {
                with(Deps.Ktor) {
                    api(clientIos)
                }
            }
        }
        val iosX64Test by getting
        val iosArm64Test by getting
        val iosSimulatorArm64Test by getting
        val iosTest by creating {
            dependsOn(commonTest)
            iosX64Test.dependsOn(this)
            iosArm64Test.dependsOn(this)
            iosSimulatorArm64Test.dependsOn(this)
        }
    }
}

后续验证步骤

  1. 确认你安装的Amazon Corretto 17为arm64架构版本,终端执行java -version若返回结果包含aarch64即为正确。
  2. 执行./gradlew clean清理项目缓存。
  3. 关闭Xcode的Rosetta运行选项,直接启动编译即可。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.26 14:36:03