添加 iOS 依赖项
Apple SDK 依赖项(如 Foundation 或 Core Bluetooth)在 Kotlin Multiplatform 项目中作为一组预构建的库提供。它们不需要任何额外的配置。
你还可以在 iOS 源代码集中重用 iOS 生态系统中的其他库和框架。 如果其 API 使用 @objc
属性导出到 Objective-C,Kotlin 支持与 Objective-C 依赖项和 Swift 依赖项的互操作性。 目前还不支持纯 Swift 依赖项。
与 CocoaPods 依赖管理器的集成也受支持,但存在相同的限制——你不能使用纯 Swift pods。
我们推荐 使用 CocoaPods 来处理 Kotlin 跨平台项目中的 iOS 依赖项。 只有在你希望专门调整互操作过程或有其他强烈原因时,才 手动管理依赖项。
使用 CocoaPods
通过在项目的
build.gradle(.kts)
文件中包含pod()
函数调用,添加对你想要使用的 CocoaPods 仓库中的 Pod 库的依赖项。kotlin { cocoapods { //.. pod("FirebaseAuth") { version = "10.16.0" } } }kotlin { cocoapods { //.. pod('FirebaseAuth') { version = '10.16.0' } } }你可以添加以下对 Pod 库的依赖项:
在 IntelliJ IDEA 中运行 Reload All Gradle Projects (或在 Android Studio 中运行 Sync Project with Gradle Files )来重新导入项目。
要在 Kotlin 代码中使用该依赖项,导入包 cocoapods.<library-name>
。对于上述示例,导入如下:
不使用 CocoaPods
如果你不想使用 CocoaPods,可以使用 cinterop 工具为 Objective-C 或 Swift 声明创建 Kotlin 绑定。 这样你就可以从 Kotlin 代码中调用它们。
下载你的依赖项。
构建它以获取其二进制文件。
创建一个特殊的
.def
文件,该文件向 cinterop 描述此依赖项。调整你的构建脚本,以便在构建过程中生成绑定。
添加不使用 CocoaPods 的库
下载库的源代码,并将其放置在项目中可以引用的位置。
构建该库(库的作者通常会提供构建指南),并获取二进制文件的路径。
在项目中创建一个
.def
文件,例如DateTools.def
。在此文件中添加第一行:
language = Objective-C
。如果你想使用纯 C 依赖项,可以省略 language 属性。为两个必需的属性提供值:
headers
描述 cinterop 将处理哪些头文件。package
设置这些声明应放入的包名。
例如:
headers = DateTools.h package = DateTools在构建脚本中添加与此库的互操作性信息:
传递
.def
文件的路径。如果你的.def
文件与 cinterop 同名并且放置在src/nativeInterop/cinterop/
目录中,则可以省略此路径。使用
includeDirs
选项告诉 cinterop 在哪里查找头文件。配置链接库二进制文件。
kotlin { iosArm64() { compilations.getByName("main") { val DateTools by cinterops.creating { // `.def` 文件的路径 definitionFile.set(project.file("src/nativeInterop/cinterop/DateTools.def")) // 头文件搜索目录(类似于 `-I<path>` 编译器选项) includeDirs("include/this/directory", "path/to/another/directory") } val anotherInterop by cinterops.creating { /* ... */ } } binaries.all { // 链接库所需的链接器选项。 linkerOpts("-L/path/to/library/binaries", "-lbinaryname") } } }kotlin { iosArm64 { compilations.main { cinterops { DateTools { // `.def` 文件的路径 definitionFile = project.file("src/nativeInterop/cinterop/DateTools.def") // 头文件搜索目录(类似于 `-I<path>` 编译器选项) includeDirs("include/this/directory", "path/to/another/directory") } anotherInterop { /* ... */ } } } binaries.all { // 链接库所需的链接器选项。 linkerOpts "-L/path/to/library/binaries", "-lbinaryname" } } }构建项目。
现在你可以在 Kotlin 代码中使用这个依赖项。为此,导入你在 .def
文件中的 package
属性中设置的包。对于上述示例,这将是:
添加不使用 CocoaPods 的框架
下载框架的源代码,并将其放置在项目中可以引用的位置。
构建框架(框架的作者通常会提供构建指南),并获取二进制文件的路径。
在项目中创建一个
.def
文件,例如MyFramework.def
。在此文件中添加第一行:
language = Objective-C
。如果你想使用纯 C 依赖项,可以省略 language 属性。为这两个必需的属性提供值:
modules
– 应由 cinterop 处理的框架名称。package
– 这些声明应放入的包名。
例如:
在构建脚本中添加与框架的互操作性信息:
传递
.def
文件的路径。如果你的.def
文件与 cinterop 同名并且放置在src/nativeInterop/cinterop/
目录中,则可以省略此路径。使用
-framework
选项将框架名称传递给编译器和链接器。 使用-F
选项将框架源代码和二进制文件的路径传递给编译器和链接器。
kotlin { iosArm64() { compilations.getByName("main") { val DateTools by cinterops.creating { // `.def` 文件的路径 definitionFile.set(project.file("src/nativeInterop/cinterop/DateTools.def")) compilerOpts("-framework", "MyFramework", "-F/path/to/framework/") } val anotherInterop by cinterops.creating { /* ... */ } } binaries.all { // 告诉链接器框架的位置。 linkerOpts("-framework", "MyFramework", "-F/path/to/framework/") } } }kotlin { iosArm64 { compilations.main { cinterops { DateTools { // `.def` 文件的路径 definitionFile = project.file("src/nativeInterop/cinterop/MyFramework.def") compilerOpts("-framework", "MyFramework", "-F/path/to/framework/") } anotherInterop { /* ... */ } } } binaries.all { // 告诉链接器框架的位置。 linkerOpts("-framework", "MyFramework", "-F/path/to/framework/") } } }构建项目。
现在你可以在 Kotlin 代码中使用这个依赖项。为此,导入你在 .def
文件中的 package 属性中设置的包。对于上述示例,这将是:
了解更多关于 Objective-C 和 Swift 互操作性 和 从 Gradle 配置 cinterop。
接下来做什么?
查看有关在多平台项目中添加依赖项的其他资源,并了解更多内容: