【问题标题】:Resolving third party cocoapod dependencies in Kotlin MPP解决 Kotlin MPP 中的第三方 cocoapod 依赖项
【发布时间】:2021-10-10 15:07:35
【问题描述】:

我正在尝试设置一个用 Kotlin Multiplatform 编写的跟踪库来支持我们所有的移动客户端。

Android 测试进展顺利(通过 gradle 集成扫雪机)。

我还设法通过 cocoapods 将 Snowplow 集成到 MPP 中。

kotlin {
    ...
    cocoapods {
        ...
        pod("SnowplowTracker") {
            version = "~> 1.3.0"
        }
    }

并在 X64 源代码集中编写了以下类:

import cocoapods.SnowplowTracker.*
import com.tracking.domain.model.*

class X64Tracker {

    private val tracker: SPTracker

    init {
        val emitter = SPEmitter.build {
            it?.setUrlEndpoint("our.staging.endpoint")
            it?.setProtocol(SPProtocol.SPProtocolHttps)
        }

        tracker = SPTracker.build {
            emitter?.let { spEmitter -> it?.setEmitter(spEmitter) }
            it?.setBase64Encoded(false)
            it?.setSubject(SPSubject(platformContext = true, andGeoContext = true))
            it?.setAppId("MPP.test")
            it?.setApplicationContext(true)
        }
    }

    fun trackSomething() {
        track(
            eventData = getEventData(
                name = "MPP_test_event",
                appArea = EventArea.Lifecycle,
                action = EventAction.Check,
                objectType = EventObjectType.Device,
                source = EventSource.Client,
                screenName = EventScreenName.Congratulations,
            ), contexts = emptyList()
        )
    }

    private fun track(eventData: SPSelfDescribingJson, contexts: List<SPSelfDescribingJson?>) {
        try {
            val yo = SPSelfDescribing.build {
                it?.setEventData(eventData)
                it?.setContexts(contexts.toMutableList())
            }

            tracker.track(yo)
        } catch (e: IllegalStateException) {
            print("snowplow was not yet initialized when the following event occurred: $eventData")
        }
    }

    private fun getEventData(
        name: String,
        appArea: EventArea,
        action: EventAction,
        objectType: EventObjectType,
        source: EventSource,
        screenName: EventScreenName,
    ) = SPSelfDescribingJson(
        SCHEMA_EVENT, mapOf(
            PROPERTY_EVENT_NAME to name,
            PROPERTY_APP_AREA to appArea.serializedName,
            PROPERTY_ACTION to action.serializedName,
            PROPERTY_OBJECT_TYPE to objectType.serializedName,
            PROPERTY_SOURCE to source.serializedName,
            PROPERTY_SCREEN_NAME to screenName.serializedName,
        )
    )

}

这可以很好地编译和构建我们的.framework 文件。以下是我们的做法:

tasks.register<org.jetbrains.kotlin.gradle.tasks.FatFrameworkTask>("debugFatFramework") {
        baseName = frameworkName + "_sim"
        group = "Universal framework"
        description = "Builds a universal (fat) debug framework"
    
        from(iosX64.binaries.getFramework("DEBUG"))
    }
    
    tasks.register<org.jetbrains.kotlin.gradle.tasks.FatFrameworkTask>("releaseFatFramework") {
        baseName = frameworkName + "_arm"
        group = "Universal framework"
        description = "Builds a universal (release) debug framework"
    
        from(iosArm64.binaries.getFramework("RELEASE"))
    }

然后我们使用以下命令将其合并到一个.xcframework 文件中:

xcrun xcodebuild -create-xcframework \
    -framework tracking_arm.framework \
    -framework tracking_sim.framework \
    -output tracking.xcframework

我们使用 Carthage 将其集成到我们的主应用程序中,但是当我尝试构建 iOS 项目时,弹出以下错误:

Undefined symbols for architecture x86_64:
  "_OBJC_CLASS_$_SPSelfDescribing", referenced from:
      objc-class-ref in tracking_sim(result.o)
ld: symbol(s) not found for architecture x86_64
clang: error: linker command failed with exit code 1 (use -v to see invocation)

奇怪的是:无论我在 cocoapods 块中定义哪个版本的 Snowplow - 我的类中的语法都不需要更改。即使更新到 Snowplow 2.x 也不需要我去掉 SP 前缀。

我完全不知道如何继续,感谢任何帮助。

【问题讨论】:

标签: kotlin kotlin-multiplatform carthage xcframework snowplow


【解决方案1】:

以下内容:

Undefined symbols for architecture x86_64:
  "_OBJC_CLASS_$_SPSelfDescribing", referenced from:
      objc-class-ref in kaiaTracking_sim(result.o)
ld: symbol(s) not found for architecture x86_64

这表示链接器找不到SPSelfDescribing。我假设SPSelfDescribingSnowplowTracker 的一部分。您需要将 SnowplowTracker 添加到 iOS 应用程序。

如果您使用 Cocoapods 将 Kotlin 集成到您的 iOS 项目中,生成的 podspec 将包含 SnowplowTracker 作为依赖项。

由于您使用 Cocoapods,因此您需要自己包含它。我们最近不得不为客户找出迦太基。出于多种原因,我强烈建议迁移到 SPM 或 Cocoapods,但这是一个不同的讨论。要将 SnowplowTracker 添加到 Carthage,请将其添加到您的购物车文件中:

github "snowplow/snowplow-objc-tracker" ~> 1.3

然后,当您更新 Carthage 时,将其添加到您的 iOS 项目中。链接器将能够找到它。

需要明确的是,Undefined symbols for architecture x86_64 错误并不是在抱怨 Kotlin。表示找不到SnowplowTracker,需要添加到iOS项目中。

【讨论】:

  • 我更新了我的问题,包括我们如何导出 .framework 文件并通过 Carthage 包含它。我们还不能迁移到 cocoapods。
  • 已更新。总结,将github "snowplow/snowplow-objc-tracker" ~&gt; 1.3 添加到您的购物车文件中。
  • 其实我们有参考;不过到 1.2 版。因此,我也将 Kotlin MPP 项目中的版本降级为 1.2,清理了构建,但仍然出现相同的错误。
  • 嗯,我不知道你需要什么版本,但是那个错误仍然是说你的iOS项目没有正确配置。 '.h' 文件声明了编译器可以预期存在的组件,并且在创建最终二进制文件时,链接器会尝试找到它们。它不能,这意味着它们没有正确添加。 Carthage 是“简单的”,但也相对不受支持,并且在许多方面都不是用户友好的。您的 Cartfile 中可能有依赖项,但需要手动将其添加到您的 iOS 项目中,等等。
  • Snowplow 已经在整个 iOS 项目中与该版本一起使用并且工作正常:/
猜你喜欢
  • 2021-09-29
  • 2021-09-08
  • 2020-12-08
  • 1970-01-01
  • 2018-12-09
  • 1970-01-01
  • 2019-05-30
  • 2017-04-14
  • 1970-01-01
相关资源
最近更新 更多