Добавление зависимостей iOS
Зависимости Apple SDK (например, Foundation или Core Bluetooth) доступны в виде набора предварительно собранных библиотек в проектах Kotlin Multiplatform Mobile. Они не требуют дополнительной настройки.
Вы также можете повторно использовать другие библиотеки и фреймворки из экосистемы iOS в своих наборах исходного кода iOS. Kotlin поддерживает взаимодействие с зависимостями Objective-C и Swift, если их API экспортированы в Objective-C с атрибутом @objc. Чистые Swift-зависимости пока не поддерживаются.
Интеграция с менеджером зависимостей CocoaPods также поддерживается с тем же ограничением — вы не можете использовать чистые Swift-подкатегории.
Мы рекомендуем использовать CocoaPods для управления зависимостями iOS в проектах Kotlin Multiplatform Mobile. Управлять зависимостями вручную следует только если вы хотите настроить процесс взаимодействия или по другим веским причинам.
С CocoaPods
-
Добавьте зависимость от библиотеки Pod из репозитория CocoaPods, которую вы хотите использовать, включив вызов функции
pod()вbuild.gradle.kts(build.gradle) вашего проекта.kotlin { cocoapods { //.. pod("AFNetworking") { version = "~> 4.0.1" } } }kotlin { cocoapods { //.. pod('AFNetworking') { version = '~> 4.0.1' } } }Вы можете добавить следующие зависимости от библиотеки Pod:
Переимпортируйте проект.
Чтобы использовать зависимость в вашем Kotlin-коде, импортируйте пакет cocoapods.<library-name>. В примере выше это:
import cocoapods.AFNetworking.*
Без CocoaPods
Если вы не хотите использовать CocoaPods, вы можете использовать инструмент cinterop для создания Kotlin-связей для объявлений Objective-C или Swift. Это позволит вам вызывать их из Kotlin-кода.
Шаги немного отличаются для библиотек и фреймворков, но идея остается той же.
Загрузите свою зависимость.
Соберите её, чтобы получить её двоичные файлы.
Создайте специальный
.defфайл, описывающий эту зависимость для cinterop.Настройте скрипт сборки для генерации связей во время сборки.
Добавление библиотеки без CocoaPods
Загрузите исходный код библиотеки и поместите его в место, откуда вы можете обратиться к нему из своего проекта.
Соберите библиотеку (авторы библиотек обычно предоставляют руководство по этому вопросу) и получите путь к двоичным файлам.
В своём проекте создайте файл
.def, напримерDateTools.def.Добавьте первую строку в этот файл:
language = Objective-C. Если вы хотите использовать чистую C-зависимость, опустите свойство языка.-
Укажите значения для двух обязательных свойств:
headersописывает, какие заголовки будут обработаны cinterop.packageзадаёт имя пакета, в который должны быть помещены эти объявления.
Например:
headers = DateTools.h package = DateTools
-
Добавьте информацию о взаимодействии с этой библиотекой в скрипт сборки:
Укажите путь к файлу
.def. Этот путь можно опустить, если ваш файл.defимеет то же имя, что и cinterop, и находится в каталогеsrc/nativeInterop/cinterop/.Укажите cinterop, где искать заголовочные файлы, используя опцию
includeDirs.Настройте связывание с двоичными файлами библиотеки.
kotlin { iosX64() { compilations.getByName("main") { val DateTools by cinterops.creating { // Path to .def file defFile("src/nativeInterop/cinterop/DateTools.def") // Directories for header search (an analogue of the -I<path> compiler option) includeDirs("include/this/directory", "path/to/another/directory") } val anotherInterop by cinterops.creating { /* ... */ } } binaries.all { // Linker options required to link to the library. linkerOpts("-L/path/to/library/binaries", "-lbinaryname") } } }kotlin { iosX64 { compilations.main { cinterops { DateTools { // Path to .def file defFile("src/nativeInterop/cinterop/DateTools.def") // Directories for header search (an analogue of the -I<path> compiler option) includeDirs("include/this/directory", "path/to/another/directory") } anotherInterop { /* ... */ } } } binaries.all { // Linker options required to link to the library. linkerOpts "-L/path/to/library/binaries", "-lbinaryname" } } } Соберите проект.
Теперь вы можете использовать эту зависимость в своём Kotlin-коде. Для этого импортируйте пакет, который вы настроили в свойстве package в файле .def . В примере выше это будет:
import DateTools.*
Добавление фреймворка без CocoaPods
Загрузите исходный код фреймворка и поместите его в место, откуда вы можете обратиться к нему из своего проекта.
Соберите фреймворк (авторы фреймворков обычно предоставляют руководство по этому вопросу) и получите путь к двоичным файлам.
В своём проекте создайте файл
.def, напримерMyFramework.def.Добавьте первую строку в этот файл:
language = Objective-C. Если вы хотите использовать чистую C-зависимость, опустите свойство языка.-
Укажите значения для этих двух обязательных свойств:
modules– имя фреймворка, который должен быть обработан cinterop.package– имя пакета, в который должны быть помещены эти объявления. Например:
modules = MyFramework package = MyFramework
-
Добавьте информацию о взаимодействии с фреймворком в скрипт сборки:
Укажите путь к файлу .def. Этот путь можно опустить, если ваш файл
.defимеет то же имя, что и cinterop, и находится в каталогеsrc/nativeInterop/cinterop/.Передайте имя фреймворка компилятору и линковщику, используя опцию
-framework. Передайте путь к исходным кодам и двоичным файлам фреймворка компилятору и линковщику, используя опцию-F.
kotlin { iosX64() { compilations.getByName("main") { val DateTools by cinterops.creating { // Path to .def file defFile("src/nativeInterop/cinterop/DateTools.def") compilerOpts("-framework", "MyFramework", "-F/path/to/framework/") } val anotherInterop by cinterops.creating { /* ... */ } } binaries.all { // Tell the linker where the framework is located. linkerOpts("-framework", "MyFramework", "-F/path/to/framework/") } } }kotlin { iosX64 { compilations.main { cinterops { DateTools { // Path to .def file defFile("src/nativeInterop/cinterop/MyFramework.def") compilerOpts("-framework", "MyFramework", "-F/path/to/framework/") } anotherInterop { /* ... */ } } } binaries.all { // Tell the linker where the framework is located. linkerOpts("-framework", "MyFramework", "-F/path/to/framework/") } } } Соберите проект.
Теперь вы можете использовать эту зависимость в своём Kotlin-коде. Для этого импортируйте пакет, который вы настроили в свойстве package в файле .def . В примере выше это будет:
import MyFramework.*
Узнайте больше о взаимодействии Objective-C и Swift и настройке cinterop из Gradle.
Решение для включения поддержки IDE для общего набора iOS-исходников
Из-за известной проблемы, вы не сможете использовать функции IDE, такие как автодополнение кода и подсветка синтаксиса, для общего набора iOS-исходников в проекте с многоплатформенной поддержкой иерархической структуры, если ваш проект зависит от:
Многоплатформенных библиотек, которые не поддерживают иерархическую структуру.
Библиотек iOS сторонних разработчиков, за исключением платформенных библиотек, поддерживаемых по умолчанию. Эта проблема затрагивает только общий набор iOS-исходников. IDE будет корректно поддерживать остальной код.
Чтобы включить поддержку IDE в этих случаях, вы можете обойти проблему, добавив следующий код в build.gradle.(kts) в каталоге shared вашего проекта:
val iosTarget: (String, KotlinNativeTarget.() -> Unit) -> KotlinNativeTarget =
if (System.getenv("SDK_NAME")?.startsWith("iphoneos") == true)
::iosArm64
else
::iosX64
iosTarget("ios")
def iosTarget
if (System.getenv("SDK_NAME")?.startsWith("iphoneos")) {
iosTarget = kotlin.&iosArm64
} else {
iosTarget = kotlin.&iosX64
}
В этом примере конфигурация целей iOS зависит от переменной среды SDK_NAME, которая управляется Xcode. Для каждого сборки будет только одна цель iOS, названная ios, которая использует iosMain набор исходников. Иерархия наборов исходников iosMain, iosArm64 и iosX64 отсутствует.
В качестве альтернативы вы можете включить поддержку межплатформенных библиотек, зависящих от платформы, в общих наборах исходников. В дополнение к платформенным библиотекам, поставляемым с Kotlin/Native, этот подход также может обрабатывать пользовательские cinterop библиотеки, делая их доступными в общих наборах исходников. Для включения этой функции добавьте свойство kotlin.mpp.enableCInteropCommonization=true в gradle.properties:
kotlin.mpp.enableCInteropCommonization=true
Что дальше?
Изучите другие ресурсы по добавлению зависимостей в многоплатформенных проектах и узнайте больше о:
© 2010–2022 JetBrains s.r.o. and Kotlin Programming Language contributors
Licensed under the Apache License, Version 2.0.
https://kotlinlang.org/docs/multiplatform-mobile-ios-dependencies.html