android - 如何将第三方 iOS pod 库添加到 kotlin 原生项目中?收到错误“SharedCode:cinteropAFNetworkingIos 失败”
问题描述
我创建了 Kotlin 本机项目以在 iOS 和 android 之间共享代码。我对 cocoapods 进行了集成,以便使用 POD 文件在 iOS 项目中使用,项目在 iOS 和 Android 上成功运行,但是当我尝试在 Kotlin 本机项目中使用 iOS pod 库时,我开始在下面收到错误。
我知道我必须首先从 Xcode 运行 pod install 才能在 Kotlin 本机项目中编译库。
所以 iOS pod 库应该通过 cinterop 转换,以便在 Kotlin Native Project 中使用。
我运行下面的命令只是为了检查框架编译是否成功。
./gradlew :SharedCode:packForXCode
得到这个错误
FAILURE: Build failed with an exception.
* What went wrong:
Execution failed for task ':SharedCode:cinteropAFNetworkingIos'.
> Cannot perform cinterop processing for AFNetworking: cannot determine headers location.
Probably the build is executed from command line.
Note that a Kotlin/Native module using CocoaPods dependencies can be built only from Xcode.
请在 Gradle 文件下方找到。
构建.Gradle.kts
plugins {
kotlin("multiplatform")
kotlin("native.cocoapods")
}
kotlin {
//select iOS target platform depending on the Xcode environment variables
val iOSTarget: (String, KotlinNativeTarget.() -> Unit) -> KotlinNativeTarget =
if (System.getenv("SDK_NAME")?.startsWith("iphoneos") == true)
::iosArm64
else
::iosX64
iOSTarget("ios") {
binaries {
framework("Shared") {
baseName = "SharedCode"
}
}
}
jvm("android")
sourceSets["commonMain"].dependencies {
implementation("org.jetbrains.kotlin:kotlin-stdlib-common")
}
sourceSets["androidMain"].dependencies {
implementation("org.jetbrains.kotlin:kotlin-stdlib")
}
version = "1.0.0"
cocoapods {
summary = "This is sample Summary"
homepage = "Home URL"
pod("AFNetworking", "~> 3.2.0")
}
}
val packForXcode by tasks.creating(Sync::class) {
group = "build"
//selecting the right configuration for the iOS framework depending on the Xcode environment variables
val mode = System.getenv("CONFIGURATION") ?: "DEBUG"
val framework = kotlin.targets.getByName<KotlinNativeTarget>("ios").binaries.getFramework(mode)
inputs.property("mode", mode)
dependsOn(framework.linkTask)
val targetDir = File(buildDir, "xcode-frameworks")
from({ framework.outputDirectory })
into(targetDir)
doLast {
val gradlew = File(targetDir, "gradlew")
gradlew.writeText("#!/bin/bash\nexport 'JAVA_HOME=${System.getProperty("java.home")}'\ncd '${rootProject.rootDir}'\n./gradlew \$@\n")
gradlew.setExecutable(true)
}
}
tasks.getByName("build").dependsOn(packForXcode)```
解决方案
我刚刚尝试了这些步骤,并设法通过使用 CocoaPods 插件的 AFNetworking 框架的工作互操作来扩展此示例。这些是我的步骤:
- 克隆项目并签出
step-008
分支后,以这种方式编辑 build.gradle.kts:将 CocoaPods 插件添加到plugins
as 部分,id("org.jetbrains.kotlin.native.cocoapods")
并从 iOSTarget 规范块中删除整个binaries
块。应该这样做,因为 cocoaPods 插件自己创建框架,我们应该避免重复(参见讨论)。而不是那个块,添加cocoapods
规范。这部分脚本应如下所示:
iOSTarget("ios") {}
version = "1.0.0"
cocoapods {
summary = "This is sample Summary"
homepage = "Home URL"
pod("AFNetworking", "~> 3.2.0")
}
- 然后,执行 Gradle 任务
podspec
为您的框架生成 podspec。这应该在/SharedCode/
目录内部完成,就像前一个一样。如果未显示任务,则表示 CocoaPods 插件未正确应用。 - 当 podspec 准备好后,我们可以从 Xcode 项目中使用它。为此,打开
/native/KotlinIOS/
目录,并在那里创建 Podfile。我使用这些内容是:
use_frameworks!
platform :ios, '9.0'
target 'KotlinIOS' do
pod 'SharedCode', :path => '../../SharedCode'
end
这里重要的部分是名称与我们的框架名称相对应,并且相对路径指向包含build.gradle.kts
第一步的位置。创建 Podfile 后,使用pod install
终端在此处安装 pod(应安装CocoaPods )。
- 现在打开
KotlinIOS.xcworkspace
用 Xcode 生成。在那里,还应该解决一件事。此时 KotlinIOS 项目设置为仅在/SharedCode/build/Xcode-frameworks/
目录中搜索框架,但 CocoaPods 不会在其中放置任何内容。因此,在左侧面板中选择 KotlinIOS,打开 Build Settings 选项卡并找到 Search Paths -> Framework Search Paths。按 + 并将 $(inherited) 添加到列表中,以使 CocoaPods 安装的框架可用。 - 现在,从 Xcode 执行 Build。之后,在您的 Kotlin IDE 中,AFNetworking 包应该可用。要导入它,请使用
import cocoapods.AFNetworking.*
. 第一次它可能需要使缓存无效并重新启动,以使其正确地看到这个包。
我希望这将有所帮助。如果本说明中有不清楚的地方,请发表评论。
推荐阅读
- java - 如何在程序生成的地牢中找到房间内的门数量?
- android - 多个前台服务的相同通知,如果其中任何一个服务停止,则保留通知
- excel - 是否有用于查找特定值并将其粘贴到右侧的下一个单元格的 R 函数(下一列相同的行号)
- python - 为什么 numpy.ndarray 允许“无”数组?
- coq - 如何在coq中找到两个列表之间的差异
- javascript - Javascript 在点击和重新加载页面上编辑 cookie 的部分值
- sass - 除非保存 main.scss,否则不会发生更改 | SASS
- layout - Vulkan:带有隐式布局转换的附件同步
- three.js - Cannon.js - 可视化身体速度路径
- objective-c - NSURLLocalizedNameKey 资源究竟返回了什么,它与 url 的最后一个路径组件有什么不同?