news 2026/7/10 22:48:36

KMP 正式支持 SwiftPM:CocoaPods 迁移配置指南

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
KMP 正式支持 SwiftPM:CocoaPods 迁移配置指南

KMP 模块里 CocoaPods 如何依赖迁到 Swift Package Manager?
页面里的入口是 Junie + Kotlin AI Skill,但迁移本身仍然要回到 Gradle、Xcode 和 Kotlin imports 这几个具体文件。

SwiftPM import 现在还是 Alpha,示例要求 KMP Gradle 插件使用2.4.0-RC2。项目里如果已经通过 CocoaPods 接了 Firebase、Google Maps 这类 iOS SDK,这个迁移就不只是替换包管理器,还会影响 iOS 侧构建方式。

先看边界

这次说的是“在 KMP 模块里引入 SwiftPM 依赖”。也就是说,Kotlin 代码可以通过 SwiftPM import 调用 Objective-C API,Kotlin/Native 编译和 framework 链接时,Gradle 插件会把 SwiftPM 依赖需要的机器码带上。

这个功能不等于把使用 SwiftPM import 的 KMP 模块再导出成一个 Swift package。文档里明确写了,这个场景还不支持,可能不能正常工作。如果你的交付方式是把 shared 模块发布成 Swift package 给 iOS 团队消费,这条限制要先确认。

另一个边界是动态 Kotlin/Native framework。遇到Undefined symbols for architecture ...dyld: Symbol not found,或者同一个 Objective-C class 在两个 binary 里重复实现时,文档给的通用处理方式是把 framework 改成静态:

kotlin{listOf(iosArm64(), iosSimulatorArm64()).forEach{iosTarget ->iosTarget.binaries.framework{baseName="Shared"isStatic=true}}}

这个点和 CocoaPods 迁移关系很近。以前很多项目会把 framework 配在cocoapods.framework {}里,迁到 SwiftPM 后,这部分要移到 Apple target 的binaries.framework {}下。

Junie 和 Skill

Junie 的使用方式比较直接。先安装 CLI,然后登录 JetBrains 账号,或者配置外部 LLM:

curl-fsSLhttps://junie.jetbrains.com/install.sh|bashjunie

项目目录下安装 Kotlin AI Skill:

npx skillsaddKotlin/kotlin-agent-skills

这个命令要求npm不低于5.2.0。交互里选择kotlin-tooling-cocoapods-spm-migration,agent 选择 Junie,scope 选择Project,这样 Skill 只落在当前项目里。

之后在项目根目录启动 Junie:

junie

输入迁移任务:

Migrate<project-name>from CocoaPods to SwiftPM

Junie 会识别刚安装的 Skill,然后开始检查项目。开始前要保证项目已经在 Git 里,因为后面要靠 diff 看它到底改了哪些文件。AI 工具会改对一部分,也可能把 Xcode 工程、Podfile 或 imports 改偏,不能把生成结果当成最终结论。

Gradle 变化

SwiftPM import 要求 Kotlin Multiplatform Gradle plugin 使用2.4.0-RC2。如果项目用 Version Catalog,版本入口大概是这样:

[versions]kotlin="2.4.0-RC2"[plugins]kotlin-multiplatform={id="org.jetbrains.kotlin.multiplatform", version.ref="kotlin"}

依赖迁移时不要一开始就删 CocoaPods。文档里的顺序是先加swiftPMDependencies {},让 SwiftPM 和 CocoaPods 依赖短时间并存,等 SwiftPM import 能解析、Kotlin 代码也能编译,再清理 CocoaPods。

FirebaseAnalytics为例,build.gradle.kts里会多一个 Swift package 声明:

kotlin{iosArm64()iosSimulatorArm64()swiftPMDependencies{swiftPackage(url=url("https://github.com/firebase/firebase-ios-sdk.git"), version=from("12.5.0"), products=listOf(product("FirebaseAnalytics")),)}cocoapods{pod("FirebaseAnalytics"){version="12.5.0"}}}

如果 Swift package 里的 Clang module 名称和 product 名称不一致,就不能只写 product。discoverClangModulesImplicitly = false之后,需要用importedClangModules明确列出来。FirebaseFirestore 的 Objective-C API 就在文档示例里的FirebaseFirestoreInternalmodule 中。

kotlin{swiftPMDependencies{discoverClangModulesImplicitly=falseswiftPackage(url=url("https://github.com/firebase/firebase-ios-sdk.git"), version=from("12.5.0"), products=listOf(product("FirebaseAnalytics"), product("FirebaseFirestore"),), importedClangModules=listOf("FirebaseAnalytics","FirebaseFirestoreInternal",),)}}

多 Apple target 项目还要看平台约束。比如 Google Maps SDK 当前只支持 iOS target,项目里如果同时有iosArm64()macosArm64(),产品声明要限制到 iOS:

kotlin{iosArm64()iosSimulatorArm64()macosArm64()swiftPMDependencies{swiftPackage(url=url("https://github.com/googlemaps/ios-maps-sdk.git"), version=exact("10.3.0"), products=listOf(product("GoogleMaps", platforms=setOf(iOS()))))}}

最后

KMP在你们的工程项目中占比多少了呢?

[#Kotlin](javascript:😉 [#KMP](javascript:😉 [#SwiftPM](javascript:😉 [#CocoaPods](javascript:😉 [#AI编程](javascript:😉

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/7/10 22:48:04

仅影响左撇子的WordPress Bug,七年后终迎修复方案!

仅影响左撇子用户的WordPress Bug&#xff1a;七年后终迎修复方案&#xff01;真的&#xff0c;有些同胞&#xff08;包括男性和女性&#xff09;习惯与众不同。多数人会用右手拇指滑动屏幕&#xff0c;这正常且恰当&#xff0c;但有一小撮不幸的人习惯用左手。瞧&#xff0c;写…

作者头像 李华
网站建设 2026/7/10 22:48:06

网站建设公司选型核心逻辑解析,附10家优秀网站服务商推荐

在数字经济时代&#xff0c;企业官网已从简单的“形象展示窗口”升级为“业务增长引擎”。2026年行业数据显示&#xff0c;68%的企业因建站决策失误导致客户流失&#xff0c;而经过专业优化的网站能将转化率提升40%以上。 企业主在评估网站建设服务时&#xff0c;首要关注技术…

作者头像 李华
网站建设 2026/7/10 22:47:06

2026免费C盘清理工具测评:哪款真正好用不流氓?

用了三年的电脑&#xff0c;C盘只剩8G了。打开任何软件都要转好几秒&#xff0c;更新Windows直接失败&#xff0c;打开剪辑工具&#xff0c;p图工具直接提示”磁盘空间不足”……这几乎是每一个电脑用户共同通病了。然后网上搜一圈C盘清理工具&#xff0c;广告满天飞&#xff0…

作者头像 李华
网站建设 2026/7/10 22:46:59

高校院所如何提升科研成果的市场转化效率与价值判断能力?

观点作者&#xff1a;科易网-国家科技成果转化&#xff08;厦门&#xff09;示范基地 核心要点 高校院所亟需借助数智化手段提升科研成果转化效率&#xff0c;解决传统模式下信息不对称、转化周期长、匹配效率低等痛点。利用基于知识图谱的数智工具可精准量化成果价值&#xff…

作者头像 李华
网站建设 2026/7/10 22:46:16

多任务并发之线程

线程什么是线程线程是一个轻量级的进程&#xff0c;用来实现多任务并发。线程是操作系统任务调度的最小单位。线程由某个进程创建线程的创建线程由所在进程创建&#xff0c;创建时&#xff0c;进程为其分配独立的栈区空间&#xff08;默认8M&#xff09;。同一个进程中的线程&a…

作者头像 李华
网站建设 2026/7/10 22:44:20

C语言如何实现C++的默认参数方法

前言 在C里&#xff0c;在声明一个函数时可以显示给参数指定默认参数值&#xff1a; void add(int a, int b 2)这样你直接调用add(1)编译器在构建的时候会默认给第二个参数传递2&#xff0c;但是C语言没有这样的能力&#xff0c;C语言是一个面向底层的语言&#xff0c;它不具备…

作者头像 李华