Невозможно импортировать библиотеку Cocoapod в собственный модуль Kotlin с общим кодом - PullRequest
0 голосов
/ 05 августа 2020

У меня есть проект android, в котором есть модуль Kotlin Native SharedCode. Цель состоит в том, чтобы разделить код между приложением android и приложением iOS.

У меня есть большой и сложный класс, который анализирует HTML с помощью библиотеки Jsoup. Я планировал использовать тот же класс в iOS, но делегировал работу по синтаксическому анализу библиотеке SwiftSoup, которая работает почти так же, как библиотека Jsoup.

Я переместил свой класс в модуль SharedCode, я внесла необходимые изменения (с фактическими, ожидаемыми и т. д.), и версия Android очень хорошо работает из этого модуля ShareCode. Учебник, которому я следовал, был этот учебник .

Модуль SharedCode был скомпилирован Android Studio, и я мог использовать его в XCode. Пока все хорошо.

Следующим шагом было включение SwiftSoup Cocoadpod в этот общий модуль, чтобы иметь возможность использовать этот модуль в Koltin Native. Я следил за этой документацией , и после некоторых начальных проблем мне удалось заставить ее работать.

Теперь нет необходимости создавать модуль SharedCode из Android Studio. Xcode запускает процесс сборки при создании приложения. Модуль Kotlin Native Shared включен как Cocoapod в проект Xcode, и он включает в себя cocoapod Swift soup, на который есть ссылка в файле build.gradle.kts.

После сборки приложения в Xcode Папка сборки создается ниже SharedCode / build. Затем я смогу импортировать пакет SwiftSoup в свой Kotlin Native класс, чтобы использовать его.

Действительно, если я напишу «import cocopapods.SwiftSoup», завершение кода сработает, и пакет будет найден . Но затем я получаю следующее сообщение об ошибке: «Пакеты не могут быть импортированы». При написании импорта функция завершения кода показывает некоторое содержимое ниже cocoapods.SwiftSoup, но не класс, который мне нужен. Только некоторые типы данных:

введите описание изображения здесь

Мне не хватает классов, содержащихся в этой библиотеке, таких как класс SwiftSoup.swift и т. Д.

Может быть, у кого-то есть представление о том, что я делаю неправильно.

1 Ответ

0 голосов
/ 18 августа 2020

Как сказал @Arytom Degtyarev, проблема заключается в том, что Swift pod «SwiftSoup» не имеет необходимого взаимодействия с Objective- C. Функции publi c этой библиотеки не были отмечены @ obje c.

Я нашел обходной путь, реализовав мою собственную «структуру» в iOS. У него есть класс, представляющий собой оболочку, предоставляющую функции из SwiftSoup, которые мне нужно вызвать в коде Kotlin. То есть для каждой функции модуля SwiftSoup, которую мне нужно вызвать в Kotlin, я предоставил функцию в моем пользовательском проекте Framework с помощью оператора @ obj c.

Затем эта структура импортируется в проект Kotlin Native и используется в варианте iOS класса kotlin.

Весь процесс немного запутанный, сложный и дорогостоящий. Цель заключалась в том, чтобы сэкономить время, не разрабатывать тот же код в iOS, но я потратил много времени, пока не узнал, как реализовать свою собственную структуру iOS, а затем смог импортировать его в модуль SharedCode Kotlin Native, затем удалось распознать код Kotlin SharedModule в Xcode и т. д.

Возможно, в будущем весь процесс станет проще.

...