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

Kotlin Multiplatform iOS集成问题:对应架构的shared.framework链接异常

解决KMP iOS架构Framework匹配问题的可行方案

方案1:拆分KMP Framework输出目录,配置Xcode条件搜索路径

先修改KMP的输出配置,让模拟器和真机的Framework分开存放,再给Xcode设置对应架构的条件搜索路径:

  • 在KMP项目的build.gradle.kts(Groovy项目用build.gradle)中,为每个iOS目标指定独立的输出目录:
iosSimulatorArm64 {
    binaries.framework {
        baseName = "shared"
        outputDirectory.set(file("build/bin/iosSimulator/debug"))
    }
}
iosArm64 {
    binaries.framework {
        baseName = "shared"
        outputDirectory.set(file("build/bin/iosDevice/debug"))
    }
}
  • 配置Xcode的条件搜索路径:
    1. 打开iOS项目的Build Settings,找到Framework Search Paths
    2. 删除原有的递归搜索路径,点击+添加新路径
    3. 点击路径右侧箭头,选择Add Conditional Setting,分别为Any iOS Simulator SDK和Any iOS SDK设置对应的KMP输出目录(比如模拟器填../你的KMP项目名/build/bin/iosSimulator/debug,真机填../你的KMP项目名/build/bin/iosDevice/debug)
      这样Xcode编译不同目标时,会自动匹配对应架构的Framework路径。

方案2:用Xcode Run Script自动切换Framework路径

如果不想改动KMP输出路径,可以添加编译前脚本自动替换正确的Framework路径:

  • 在iOS项目的Target里,新增一个Run Script Phase,并将其拖动到Link Binary With Libraries步骤之前
  • 脚本内容如下(记得替换KMP_FRAMEWORK_ROOT为你的KMP项目实际路径):
# 获取当前编译的SDK类型
SDK_TYPE=$SDK_NAME

# 定义KMP Framework的基础路径
KMP_FRAMEWORK_ROOT="../你的KMP项目名/build/bin"

# 根据SDK选择对应架构的Framework路径
if [[ "$SDK_TYPE" == *simulator* ]]; then
    TARGET_FRAMEWORK="$KMP_FRAMEWORK_ROOT/iosSimulator/debug/shared.framework"
else
    TARGET_FRAMEWORK="$KMP_FRAMEWORK_ROOT/iosDevice/debug/shared.framework"
fi

# 更新Xcode的框架搜索路径
/usr/libexec/PlistBuddy -c "Set :FRAMEWORK_SEARCH_PATHS:0 $TARGET_FRAMEWORK" "$BUILT_PRODUCTS_DIR/$INFOPLIST_PATH"

每次编译时,脚本会自动识别当前是模拟器还是真机环境,切换到正确的Framework路径。

方案3:用CocoaPods管理KMP Framework(最省心)

借助CocoaPods自动处理架构匹配问题,无需手动配置路径:

  1. 在KMP项目的build.gradle.kts中启用CocoaPods插件:
plugins {
    kotlin("multiplatform")
    id("com.android.library")
    id("org.jetbrains.kotlin.native.cocoapods")
}

cocoapods {
    summary = "你的KMP共享框架描述"
    ios.deploymentTarget = "14.0"
    framework {
        baseName = "shared"
    }
    // 指定iOS项目的Podfile路径
    podfile = project.file("../你的iOS项目名/Podfile")
}
  1. 在iOS项目的Podfile中添加依赖:
pod 'shared', :path => '../你的KMP项目名'
  1. 执行pod install,后续Xcode编译时,CocoaPods会自动根据当前编译目标(模拟器/真机)拉取对应架构的Framework,完全无需手动干预路径。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.13 19:01:03