CocoaPods 概述与设置
Kotlin/Native 提供了与 CocoaPods 依赖管理器 的集成功能. 你可以添加对 Pod 库的依赖项, 也可以使用跨平台项目的原生编译目标作为 CocoaPods 依赖项.
可以直接在 IntelliJ IDEA 中管理 Pod 依赖项, 并使用所有额外的功能特性, 比如代码高亮度和代码自动完成. 可以使用 Gradle 来构建整个 Kotlin 项目, 而不必切换到 Xcode.
只有在需要编写 Swift/Objective-C 代码, 或在模拟器或设备上运行应用程序时, 才需要使用 Xcode. 要与 Xcode 正确的协同工作, 你需要 更新你的 Podfile.
根据你的项目和目的不同, 可以添加 Kotlin 项目对 Pod 库的依赖项, 以及 Kotlin Gradle 项目对 Xcode 项目的依赖项.
设置 CocoaPods 环境
使用你选择的安装工具, 安装 CocoaPods 依赖项管理器:
如果你还没有, 请先安装 RVM (Ruby 版本管理器).
安装 Ruby. 你可以选择特定的版本:
rvm install ruby 3.0.0安装 CocoaPods:
sudo gem install -n /usr/local/bin cocoapods
如果你还没有, 请先从 GitHub 安装 rbenv.
安装 Ruby. 你可以选择特定的版本:
rbenv install 3.0.0对某个目录设置局部的 Ruby 版本, 或对整个机器设置全局的 Ruby 版本:
rbenv global 3.0.0安装 CocoaPods:
sudo gem install -n /usr/local/bin cocoapods
你可以使用 macOS 上默认的 Ruby 来安装 CocoaPods 依赖管理器:
如果你还没有, 请先安装 Homebrew.
安装 CocoaPods:
brew install cocoapods
如果你使用 Kotlin 1.7.0 以前的版本
如果你目前的 Kotlin 版本低于 1.7.0, 那么还需要安装 cocoapods-generate
plugin:
sudo gem install -n /usr/local/bin cocoapods-generate
如果你在安装过程中遇到问题, 请参见 可能发生的问题与解决方案 小节.
添加并配置 Kotlin CocoaPods Gradle plugin
如果你的环境已经正确设置, 你可以 创建一个新的 Kotlin Multiplatform 项目, 并在 iOS framework distribution 选项中, 选择 CocoaPods Dependency Manager. 插件会为你自动生成项目.
如果想要手动配置你的项目:
在你的项目的
build.gradle(.kts)
文件中, 应用 CocoaPods 插件和 Kotlin Multiplatform 插件:plugins { kotlin("multiplatform") version "1.9.23" kotlin("native.cocoapods") version "1.9.23" }在
cocoapods
代码段中, 配置 Podspec 文件的version
,summary
,homepage
, 和baseName
.plugins { kotlin("multiplatform") version "1.9.23" kotlin("native.cocoapods") version "1.9.23" } kotlin { cocoapods { // 必须属性 // 在这里指定需要的 Pod 版本. 否则, 会使用 Gradle 项目的版本. version = "1.0" summary = "Some description for a Kotlin/Native module" homepage = "Link to a Kotlin/Native module homepage" // 可选属性 // 在这里配置 Pod 名称, 而不是修改 Gradle 项目名称 name = "MyCocoaPod" framework { // 必须属性 // 配置框架名称. 'frameworkName' 属性已废弃, 请改为使用这个属性 baseName = "MyFramework" // 可选属性 // 指定框架的链接类型. 默认为 dynamic. isStatic = false // 导出依赖项 export(project(":anotherKMMModule")) transitiveExport = false // 这是默认值. // 嵌入 bitcode embedBitcode(BITCODE) } // 将自定义的 Xcode 配置对应到 NativeBuildType xcodeConfigurationToNativeBuildType["CUSTOM_DEBUG"] = NativeBuildType.DEBUG xcodeConfigurationToNativeBuildType["CUSTOM_RELEASE"] = NativeBuildType.RELEASE } }重新导入项目.
生成 Gradle wrapper, 以免在 Xcode 构建时发生兼容性问题.
应用 CocoaPods 插件后, 它会完成如下工作:
对所有的 macOS, iOS, tvOS, 和 watchOS 编译目标, 将
debug
和release
框架添加为输出的二进制文件.创建
podspec
任务, 它会为项目生成一个 Podspec 文件.
Podspec
文件包含输出框架的路径, 以及一段脚本, 负责在 Xcode 项目的构建过程中, 自动构建这个框架.
为 Xcode 更新 Podfile 文件
如果要在一个 Xcode 项目中导入你的 Kotlin 项目, 需要修改你的 Podfile 文件:
如果你的项目存在任何 Git, HTTP, 或 自定义 Podspec 仓库的依赖项, 那么还需要在 Podfile 中指定 Podspec 的路径.
例如, 如果添加了
podspecWithFilesExample
的依赖, 需要在 Podfile 文件中声明 Podspec 路径:target 'ios-app' do # ... 其他依赖项 ... pod 'podspecWithFilesExample', :path => 'cocoapods/externalSources/url/podspecWithFilesExample' end:path
应该包含 Pod 的文件路径.如果添加一个来自自定义 Podspec 仓库的库, 那么还需要在 Podfile 文件的最开始指定 spec 的位置:
source 'https://github.com/Kotlin/kotlin-cocoapods-spec.git' target 'kotlin-cocoapods-xcproj' do # ... 其他依赖项 ... pod 'example' end
如果不对 Podfile 文件进行这些修改, podInstall
任务将会失败, CocoaPods plugin 会在 log 中显示错误消息.
可能发生的问题与解决方案
CocoaPods 安装
Ruby 安装
CocoaPods 是基于 Ruby 开发的, 你可以使用 macOS 上默认可用的 Ruby 环境来安装它. Ruby 1.9 或更高版本带有一个内建的 RubyGems 包管理框架, 可以帮助你安装 CocoaPods 依赖管理器.
如果你在安装或使用 CocoaPods 时遇到问题, 请参照 这篇向导文档 来安装 Ruby, 或参照 RubyGems 网站 来安装 RubyGems 框架.
版本兼容性
我们推荐使用最新的 Kotlin 版本. 如果你目前的版本低于 1.7.0, 你还需要安装 cocoapods-generate
插件.
但是, cocoapods-generate
不兼容 Ruby 3.0.0 或更高版本. 这种情况下, 请降级 Ruby, 或升级 Kotlin 到 1.7.0 或更高版本.
找不到模块
你可能遇到 module 'SomeSDK' not found
错误, 这是 与 C 代码交互 相关的问题. 请使用以下变通方法解决这个错误:
指定框架名称
在下载的 Pod 目录
[shared_module_name]/build/cocoapods/synthetic/IOS/Pods/...
中找到module.modulemap
文件:检查模块内的框架名称, 比如
AppsFlyerLib {}
. 如果框架名称与 Pod 名称不匹配, 请明确指定它:pod("FirebaseAuth") { moduleName = "AppsFlyerLib" }
指定头文件
如果在生成的 .def
文件中 Pod 没有包含 .modulemap
文件, 比如 pod("NearbyMessages")
, 请明确的指定 main 头文件:
详情请参见 CocoaPods 文档. 如果尝试过以上方法后, 仍然发生这个错误, 请到 YouTrack 报告问题.
同步错误
你可能会遇到 rsync error: some files could not be transferred
错误. 这是一个 已知的问题, 如果 Xcode 中的应用程序编译目标启用了用户脚本的沙箱功能(sandboxing), 就会发生这个错误.
要解决这个问题:
在应用程序目标设定中禁用用户脚本的沙箱功能:
停止可能已经启用了沙箱功能的 Gradle daemon 进程:
./gradlew --stop