KMP - 如何使用 CocoaPods 通过 FirebaseFirestore 在 KMP 中获得 XCode 预览?

问题描述 投票:0回答:1

在将 FirebaseFirestore 与 CocoaPods 结合使用时,我尝试在 kotlin 多平台项目中构建 Xcode 预览。

使用以下 gradle 文件一切正常,应用程序运行和预览运行。

模块

build.gradle.kts

plugins {
    //trick: for the same plugin versions in all sub-modules
    alias(libs.plugins.androidApplication).apply(false)
    alias(libs.plugins.androidLibrary).apply(false)
    alias(libs.plugins.kotlinAndroid).apply(false)
    alias(libs.plugins.kotlinMultiplatform).apply(false)
    alias(libs.plugins.kotlinCocoapods).apply(false)

    id("com.google.gms.google-services") version "4.4.0" apply false
}

buildscript {
    dependencies {
        classpath("dev.icerock.moko:resources-generator:0.23.0")
    }
}

gradle.properties

#Gradle
org.gradle.jvmargs=-Xmx2048M -Dfile.encoding=UTF-8 -Dkotlin.daemon.jvm.options\="-Xmx2048M"
org.gradle.caching=true
org.gradle.configuration-cache=true

#Kotlin
kotlin.code.style=official
#Is forced by Moko Resources library (specificaly by "androidMain.dependsOn(...)")
kotlin.mpp.applyDefaultHierarchyTemplate=false 

#Android
android.useAndroidX=true
android.nonTransitiveRClass=true

共享

build.gradle.kts
:

plugins {
    alias(libs.plugins.kotlinMultiplatform)
    alias(libs.plugins.kotlinCocoapods)
    alias(libs.plugins.androidLibrary)

    id("com.google.devtools.ksp") version "1.9.20-1.0.14"
    id("com.rickclephas.kmp.nativecoroutines") version "1.0.0-ALPHA-21"

    kotlin("plugin.serialization") version "1.9.20"

    id("dev.icerock.mobile.multiplatform-resources")
}

kotlin {
    androidTarget {
        compilations.all {
            kotlinOptions {
                jvmTarget = "11"
            }
        }
    }
    iosX64()
    iosArm64()
    iosSimulatorArm64()

    jvmToolchain {
        languageVersion.set(JavaLanguageVersion.of("11"))
    }

    cocoapods {
        summary = "Some description for the Shared Module"
        homepage = "Link to the Shared Module homepage"
        version = "1.0"
        ios.deploymentTarget = "16.0"
        podfile = project.file("../iosApp/Podfile")
        framework {
            baseName = "shared"
            isStatic = false

            export("dev.icerock.moko:resources:0.23.0")
            export("dev.icerock.moko:graphics:0.9.0")
        }

        pod("FirebaseCore", linkOnly = true)
        pod("FirebaseAuth", linkOnly = true)
        //pod("FirebaseCoreExtension", linkOnly = true)
        //pod("FirebaseSharedSwift", linkOnly = true)
        //pod("FirebaseFirestore", linkOnly = true)
    }
    
    sourceSets {
        sourceSets.all {
            languageSettings.optIn("kotlin.experimental.ExperimentalObjCName")
            languageSettings.optIn("kotlinx.cinterop.ExperimentalForeignApi")
        }
        androidMain {
            dependsOn(commonMain.get()) // Moko Resources needs this dependency
        }
        // Implicitly specifies dependencies because Moko Resources disabled the default hierarchy template via "androidMain.dependsOn(...)" above
        val iosX64Main by getting
        val iosArm64Main by getting
        val iosSimulatorArm64Main by getting
        val iosMain by creating {
            dependsOn(commonMain.get())
            iosX64Main.dependsOn(this)
            iosArm64Main.dependsOn(this)
            iosSimulatorArm64Main.dependsOn(this)
        }
        commonMain.dependencies {
            api("com.rickclephas.kmm:kmm-viewmodel-core:1.0.0-ALPHA-15")

            implementation("org.jetbrains.kotlinx:kotlinx-serialization-json:1.6.0")

            api("dev.icerock.moko:resources:0.23.0")
            api("dev.icerock.moko:resources-compose:0.23.0")

            api("org.lighthousegames:logging:1.3.0")

            implementation("dev.gitlive:firebase-auth:1.10.4")
            //implementation("dev.gitlive:firebase-firestore:1.10.4")
        }

        commonTest.dependencies {
            implementation(libs.kotlin.test)

            implementation("dev.icerock.moko:resources-test:0.23.0")
        }
    }
}

android {
    namespace = "com.example.project"
    compileSdk = 34
    defaultConfig {
        minSdk = 24
    }
}

multiplatformResources {
    multiplatformResourcesPackage = "com.example.project"
    iosBaseLocalizationRegion = "en"
}

// This resolves Moko Resources issue where the build order could be wrong
tasks.configureEach {
    if (name == "generateMRcommonMain") {
        dependsOn("kspKotlinIosX64")
        dependsOn("kspKotlinIosArm64")
        dependsOn("kspKotlinIosSimulatorArm64")
    }
    if (name == "generateMRiosX64Main") {
        dependsOn("kspKotlinIosX64")
    }
    if (name == "generateMRiosArm64Main") {
        dependsOn("kspKotlinIosArm64")
    }
    if (name == "generateMRiosSimulatorArm64Main") {
        dependsOn("kspKotlinIosSimulatorArm64")
    }
}

Podfile

target 'iosApp' do
  use_frameworks!
  platform :ios, '16.0'
  pod 'shared', :path => '../shared'
  
  pod 'KMPNativeCoroutinesCombine', '1.0.0-ALPHA-21'
  
  pod 'KMMViewModelSwiftUI', '1.0.0-ALPHA-15'

  # Required by shared firebase dependencies
  pod 'FirebaseAuth'
  pod 'FirebaseFirestore'
end

但是如果我取消注释 Firestore 行:

pod("FirebaseCoreExtension", linkOnly = true)
pod("FirebaseSharedSwift", linkOnly = true)
pod("FirebaseFirestore", linkOnly = true)

implementation("dev.gitlive:firebase-firestore:1.10.4")

甚至应用程序现在也无法构建并出现错误:

ld: Undefined symbols:
    _FIRFirestoreErrorDomain, referenced from:
        _cocoapods_FirebaseFirestore_FIRFirestoreErrorDomain_getter_wrapper0 in libdev.gitlive:firebase-firestore-cinterop-FirebaseFirestore-cache.a[2](libdev.gitlive:firebase-firestore-cinterop-FirebaseFirestore-cache.a.o)
    _OBJC_CLASS_$_FIRDocumentChange, referenced from:
        in libdev.gitlive:firebase-firestore-cache.a[2](libdev.gitlive:firebase-firestore-cache.a.o)
    _OBJC_CLASS_$_FIRDocumentReference, referenced from:
        in libdev.gitlive:firebase-firestore-cache.a[2](libdev.gitlive:firebase-firestore-cache.a.o)
    _OBJC_CLASS_$_FIRDocumentSnapshot, referenced from:
        in libdev.gitlive:firebase-firestore-cache.a[2](libdev.gitlive:firebase-firestore-cache.a.o)
    _OBJC_CLASS_$_FIRFieldPath, referenced from:
        in libdev.gitlive:firebase-firestore-cache.a[2](libdev.gitlive:firebase-firestore-cache.a.o)
    _OBJC_CLASS_$_FIRFieldValue, referenced from:
        in libdev.gitlive:firebase-firestore-cache.a[2](libdev.gitlive:firebase-firestore-cache.a.o)
    _OBJC_CLASS_$_FIRFirestore, referenced from:
        in libdev.gitlive:firebase-firestore-cache.a[2](libdev.gitlive:firebase-firestore-cache.a.o)
    _OBJC_CLASS_$_FIRGeoPoint, referenced from:
        in libdev.gitlive:firebase-firestore-cache.a[2](libdev.gitlive:firebase-firestore-cache.a.o)
    _OBJC_CLASS_$_FIRQuerySnapshot, referenced from:
        in libdev.gitlive:firebase-firestore-cache.a[2](libdev.gitlive:firebase-firestore-cache.a.o)
    _OBJC_CLASS_$_FIRTimestamp, referenced from:
        in libdev.gitlive:firebase-firestore-cache.a[2](libdev.gitlive:firebase-firestore-cache.a.o)

请注意,我正在使用动态框架进行预览仅链接窗格来解决丢失/重复的引用

我不会在

commonMain
之外使用 FirebaseFirestore,而且也不打算这样做。

google-cloud-firestore cocoapods kotlin-multiplatform firebase-dynamic-links xcode-previews
1个回答
0
投票

我终于想通了。问题出在 firebase pod 的版本上。 Kotlin firebase 库 与最新的 swift firebase 库不兼容,尽管我没有 在指定的任何地方都可以找到它,但它就是不起作用。

Swift 版本

10.12
正在与当前最新的 kotlin 版本
1.10.4
配合使用。

所以我只是指定了 pod 的版本:

共享

build.gradle.kts
:

...
kotlin {
    ...

    cocoapods {
        summary = "Some description for the Shared Module"
        homepage = "Link to the Shared Module homepage"
        version = "1.0"
        ios.deploymentTarget = "16.0"
        podfile = project.file("../iosApp/Podfile")
        framework {
            baseName = "shared"
            isStatic = false

            ...
        }

        pod("FirebaseAuth") {
            version = "10.12"
            linkOnly = true
        }
        pod("FirebaseFirestore") {
            version = "10.12"
            linkOnly = true
        }
    }
    
    sourceSets {
        ...
        commonMain.dependencies {
            ...

            implementation("dev.gitlive:firebase-auth:1.10.4")
            implementation("dev.gitlive:firebase-firestore:1.10.4")
        }
        ...
    }
}
...

Podfile

  ...
  # Required by shared firebase dependencies
  pod 'FirebaseAuth', '10.12'
  pod 'FirebaseFirestore', '10.12'
end

不再需要显式添加 pod 的依赖,如

FirebaseCore

感谢 kotlin 库 github 上的 issue 线程,我找到了答案。它只是非常遥远的相关,但它可能会有所帮助。

© www.soinside.com 2019 - 2024. All rights reserved.