【问题标题】:Adding Snowplow to Kotlin multiplatform project for iOS将 Snowplow 添加到适用于 iOS 的 Kotlin 多平台项目
【发布时间】:2021-09-11 16:46:27
【问题描述】:

我正在尝试将 Snowplow 集成到 Kotlin 多平台项目中。

Android 运行良好:

val androidMain by getting {
        dependencies {
            api("com.snowplowanalytics:snowplow-android-tracker:1.7.1")
        }
    }

但是集成 iOS Cocoapod 会带来一些麻烦。我添加了 cocoapod 插件:

plugins {
    kotlin("multiplatform") version "1.4.32"
}

还有 Snowlow 吊舱:

kotlin {
    iosX64()
    iosArm64()
    cocoapods {
        pod("SnowplowTracker") {
            version = "~> 2.1.1"
        }
    }
}

Gradle 同步导致以下错误:

Exception in thread "main" java.lang.Error: /var/folders/gv/rc4dmzjs3wj9kt4kr00nwhdw0000gn/T/2185483547857483783.m:1:9: fatal error: module 'SnowplowTracker' not found
    at org.jetbrains.kotlin.native.interop.indexer.UtilsKt.ensureNoCompileErrors(Utils.kt:152)
    at org.jetbrains.kotlin.native.interop.indexer.ModuleSupportKt.getModulesASTFiles(ModuleSupport.kt:68)
    at org.jetbrains.kotlin.native.interop.indexer.ModuleSupportKt.getModulesInfo(ModuleSupport.kt:14)
    at org.jetbrains.kotlin.native.interop.gen.jvm.MainKt.buildNativeLibrary(main.kt:506)
    at org.jetbrains.kotlin.native.interop.gen.jvm.MainKt.processCLib(main.kt:264)
    at org.jetbrains.kotlin.native.interop.gen.jvm.MainKt.interop(main.kt:74)
    at org.jetbrains.kotlin.cli.utilities.InteropCompilerKt.invokeInterop(InteropCompiler.kt:45)
    at org.jetbrains.kotlin.cli.utilities.MainKt.mainImpl(main.kt:19)
    at org.jetbrains.kotlin.cli.utilities.MainKt.main(main.kt:41)

Execution failed for task ':cinteropSnowplowTrackerIosArm64'.
> Process 'command '/Library/Java/JavaVirtualMachines/jdk-14.0.1.jdk/Contents/Home/bin/java'' finished with non-zero exit value 1

作为 Android 开发人员,我对 pod 及其错误的了解基本上为零。我感谢任何有关解决方案的提示,因为 Google 到目前为止没有提供帮助。

【问题讨论】:

  • 我个人不使用 cocoapods 插件添加依赖项,因为它还不够稳定(巨大的编译时间增量)。但是 jetbrains 在 youtrack.jetbrains.com 上帮助快速解决此类 cocoapods 问题,通常是因为非标准 cocoapods 配置(在框架方面)。在那里创建一个问题。
  • 那怎么添加依赖呢?
  • 我在 kotlin 部分创建接口,在 swift 中实现这些接口的成员——在那里我可以使用依赖项,并将这些类的对象传递给共享模块。 Ofc 它的代码要多得多,但构建时间对我来说成本更高

标签: ios kotlin cocoapods kotlin-multiplatform snowplow


【解决方案1】:

我想说这里重要的是满足the documentation 中列出的所有要求。我最关心的是你的项目是否配置了

summaryhomepageframeworkName 在 cocoapods 块中的 Podspec 文件。
version 是 Gradle 项目的一个版本。

从问题中可以看出,现在只有pod()。 此外,正如documentation 和@Webfreak 所建议的那样,添加deploymentTarget 在这里也可能有所帮助。

【讨论】:

  • 实际上我已经将目标设置为 8.0。 (错误告诉我它会自动将目标设置为 8.0,因为它之前没有设置)。看起来将目标设置为 14 解决了这个问题。
  • Gradle 同步现在确实可以工作,但我仍然无法访问 iOSMain() 中该依赖项的任何代码。还有什么我想念的吗?编辑:看起来它不适用于 iOSMain 层次结构。必须恢复到 Arm/X64 目标
  • 正确。使用来自 iosMain 源集的 cocoapods 依赖项需要实现 this 功能。单独的 Arm64/X64 目标将更易于管理。您还想了解我们推荐的the workaround
【解决方案2】:

我相信您还需要像这样指定 podfile 的路径和(不确定是否需要)部署目标:

 cocoapods {
    ....
    podfile = project.file("../iosApp/Podfile")
    ios.deploymentTarget = "10.0"
 }

还可以尝试手动运行 cocoapod gradle 任务 podImportpodInstall

【讨论】:

  • 我正在编写一个库,而不是一个应用程序。那么适应 iosArm64Main 的路径应该可以完成这项工作吗?我还需要了解如何获取/生成 Podfile
  • 即使你在写一个库,你也需要xcode工作区项目。为了在 kotlin 原生项目中使用 cocoapods。如果没有对应的 xcodeworkspace 项目,则无法创建使用 cocoapod 的 kotlin 本机项目。您可以通过运行命令 pod init 来创建 podfile。
  • 来自文档:>您可以直接在 IntelliJ IDEA 中管理 Pod 依赖项,并享受代码高亮和补全等所有附加功能。您可以使用 Gradle 构建整个 Kotlin 项目,而不必切换到 Xcode。
  • 正确。但是您仍然需要一个“演示”iOS 项目来测试解决方案(例如:运行使用您的 k/n 库的测试 ios 应用程序)。我原来的回答中提到了这个项目的 podfile。
  • 这将是我包含生成的 iOS 框架(我们的主应用程序)的项目。但是当 gradle 无法同步/构建 Kotlin MPP 时,我无法导出任何框架。所以我期待 MPP 中该错误的解决方案
猜你喜欢
  • 1970-01-01
  • 2019-12-01
  • 2020-09-05
  • 1970-01-01
  • 2019-11-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多