Как добавить стороннюю библиотеку iOS pod в kotlin собственный проект? получаю ошибку "SharedCode: cinteropAFNetworking Ios не удалось" - PullRequest
0 голосов
/ 08 февраля 2020

Я создал Kotlin собственный проект для общего кода между iOS и android. Я сделал интеграцию для cocoapods для использования в проекте iOS с использованием файла POD, Проект успешно запущен на iOS и Android но когда я попытался использовать iOS библиотеку pod в Kotlin native проекте, я начинаю получать сообщения об ошибках ниже.

Я знаю, что сначала мне нужно запустить pod install из Xcode, чтобы скомпилировать библиотеку в Kotlin собственный проект.

SO 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.

build.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)```




1 Ответ

2 голосов
/ 10 февраля 2020

Я только что попробовал эти шаги и сумел расширить этот образец с рабочим взаимодействием инфраструктуры AFNetworking с помощью плагина CocoaPods. Вот мои шаги:

  1. После клонирования проекта и проверки ветки step-008 отредактируйте build.gradle.kts таким образом: добавьте плагин CocoaPods в раздел plugins как id("org.jetbrains.kotlin.native.cocoapods") и удалить весь блок binaries из блока спецификации iOSTarget. Это должно быть сделано, потому что плагин cocoaPods создает фреймворк самостоятельно, и нам следует избегать дублирования (см. обсуждение ). Вместо этого блока добавьте cocoapods спецификацию. Эта часть скрипта должна выглядеть так:
iOSTarget("ios") {}
    version = "1.0.0"
    cocoapods {
        summary = "This is sample Summary"
        homepage = "Home URL"

        pod("AFNetworking", "~> 3.2.0")
    }
Затем выполните задачу Gradle podspec, чтобы сгенерировать podspe c для вашей платформы. Это должно быть сделано внутри каталога /SharedCode/, как и предыдущий. Если задача не представлена, это означает, что плагин CocoaPods был применен неправильно. Когда podspe c готов, мы можем использовать его из проекта Xcode. Для этого откройте каталог /native/KotlinIOS/ и создайте в нем Podfile. Я использовал это содержимое для:
use_frameworks!

platform :ios, '9.0'

target 'KotlinIOS' do
    pod 'SharedCode', :path => '../../SharedCode'
end

Важной частью здесь является то, что имя соответствует имени нашего фреймворка, а относительный путь указывает на место, содержащее build.gradle.kts с первого шага. После создания Podfile, установите pods здесь, используя pod install от терминала (CocoaPods должен быть установлен ).

Теперь откройте сгенерированный KotlinIOS.xcworkspace с Xcode. Там еще одна вещь должна быть исправлена. На данный момент проект KotlinIOS настроен на поиск фреймворков только в каталоге /SharedCode/build/Xcode-frameworks/, но CocoaPods не будет ничего там размещать. Итак, выберите KotlinIOS на левой панели, откройте вкладку Настройки сборки и найдите там Пути поиска -> Пути поиска платформы. Нажмите + и добавьте $ (унаследованный) в список, чтобы сделать доступными рамки, которые установил CocoaPods. Теперь выполните Build from Xcode. После этого в вашей Kotlin IDE должен появиться пакет AFNetworking. Чтобы импортировать его, используйте import cocoapods.AFNetworking.*. Впервые может потребоваться аннулировать кэши и перезапустить, чтобы он правильно видел этот пакет.

Надеюсь, это поможет. Пожалуйста, прокомментируйте, если что-то неясно в этой инструкции.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...