Создание кроссплатформенного приложения
В этом руководстве вы создадите и запустите первое Kotlin Multiplatform-приложение с общей логикой и нативным UI для Android и iOS. Kotlin Multiplatform позволяет разделять код между платформами и писать platform-specific-код только там, где нужен нативный UI или доступ к API конкретной платформы.
Перед началом выполните шаги из quickstart, чтобы настроить окружение.
Создание проекта
- В IntelliJ IDEA выберите File | New | Project.
- В панели слева выберите Kotlin Multiplatform.
- Укажите имя проекта, например
GreetingKMP, и Project ID, напримерcom.jetbrains.greetingkmp. - Выберите цели Android и iOS.
- Для iOS выберите вариант Do not share UI, чтобы сохранить UI нативным.
- После заполнения полей нажмите Create.
IDE может предложить обновить Android Gradle plugin до последней версии. Для KMP-проектов сначала проверьте таблицу совместимости, потому что не каждая новая версия AGP сразу совместима с Kotlin Multiplatform.
Структура проекта
Проект с общей логикой и нативным UI обычно содержит такие модули:
androidApp- Kotlin-модуль, который собирается в Android-приложение и использует общий модуль как обычную Android-библиотеку.iosApp- Xcode-проект для iOS-приложения. Он зависит от общего модуля, который экспортируется как iOS framework.sharedLogic- мультиплатформенный модуль с общей логикой для Android и iOS.sharedUI- модуль с Compose Multiplatform UI-кодом. В проекте с нативным iOS UI он может использоваться только Android-приложением, но остаётся мультиплатформенным модулем.
Все модули, кроме iosApp, используют Gradle.
Исходные наборы commonMain, androidMain и iosMain позволяют разделять общий и platform-specific-код.
commonMain содержит код, независимый от платформы. В androidMain можно использовать Kotlin/JVM и Android API, а в
iosMain - Kotlin/Native и iOS API.
Общие объявления
Общий код находится в sharedLogic/src/commonMain. Он должен быть platform-independent. Если в общем исходном наборе
попытаться использовать platform-specific API, IDE покажет предупреждение.
Для доступа к platform-specific-функциям используйте механизм expect/actual. Например, общий исходный набор может
объявить интерфейс платформы:
interface Platform {
val name: String
}
Платформенные исходные наборы предоставляют реализации:
// Platform.android.kt в androidMain
import android.os.Build
class AndroidPlatform : Platform {
override val name: String = "Android ${Build.VERSION.SDK_INT}"
}
// Platform.ios.kt в iosMain
import platform.UIKit.UIDevice
class IOSPlatform : Platform {
override val name: String =
UIDevice.currentDevice.systemName() + " " + UIDevice.currentDevice.systemVersion
}
Общая функция может быть объявлена как expect, а платформенные реализации - как actual:
// Platform.kt в commonMain
expect fun getPlatform(): Platform
// Platform.android.kt в androidMain
actual fun getPlatform(): Platform = AndroidPlatform()
// Platform.ios.kt в iosMain
actual fun getPlatform(): Platform = IOSPlatform()
expect и actual объявления должны находиться в одном пакете. При сборке для конкретной платформы компилятор
объединяет их в одно объявление с нужной реализацией.
Запуск приложения
Вы можете запускать Android- и iOS-приложения из IntelliJ IDEA.
Android
- В списке run configurations выберите
androidApp. - Выберите Android Virtual Device рядом со списком конфигураций и нажмите Run.
Если устройства нет в списке, создайте новый Android Virtual Device.
iOS
Если вы ещё не запускали Xcode после установки или обновления, сделайте это перед запуском iOS-приложения.
В IntelliJ IDEA выберите iosApp в списке run configurations, выберите симулятор рядом с конфигурацией и нажмите
Run. Если доступной iOS-конфигурации нет, запустите Xcode, чтобы обновить список симуляторов, и перезапустите IDE.
Реальное iOS-устройство
Для запуска на реальном iPhone нужен Team ID, связанный с вашим Apple ID.
Сначала настройте команду в Xcode:
- Откройте проект в Xcode через File | Open Project in Xcode.
- В Project navigator выберите
iosApp. - Выберите target
iosAppи откройте вкладку Signing & Capabilities. - В списке Team выберите свою команду.
- Убедитесь, что Bundle Identifier уникален и Signing Certificate назначен успешно.
После настройки команды можно выбрать или изменить её в IntelliJ IDEA в настройках run configuration для iosApp.
Подключите iPhone кабелем. Если устройство уже зарегистрировано в Xcode, оно появится в списке доступных устройств для
конфигурации iosApp. Если нет, следуйте
рекомендациям Apple:
включите Developer Mode на устройстве, откройте Window | Devices and Simulators в Xcode и завершите pairing.
Следующий шаг
Дальше можно перейти к обновлению UI с помощью platform-specific-библиотек: Update the user interface.
См. также: