Назад к вопросам
Senior
85
questionbank
Работали ли вы с Kotlin Multiplatform?
Sobes Copilot
Получайте ответы в реальном времени
Ответ от нейросети
sobes.tech AI
Да, работал.
Использовал Kotlin Multiplatform Mobile (KMM) для создания общей бизнес-логики в iOS и Android приложениях.
Основные преимущества KMM:
- Общая кодовая база для бизнес-логики.
- Возможность использовать нативные UI-фреймворки.
- Хорошая интероперабельность с Java/Kotlin на Android и Swift/Objective-C на iOS.
- Постепенное внедрение в существующие проекты.
Пример использования KMM:
- Сетевой слой (Ktor).
- База данных (SQLDelight).
- Работа с preferences (Multiplatform Settings).
- Бизнес-логика (ViewModel'ы, Use Cases).
Структура типового KMM-проекта:
shared: Общий модуль.androidApp: Android-приложение, зависящее отshared.iosApp: iOS-приложение, зависящее отshared.
Зависимости в KMM описываются в build.gradle.kts shared-модуля с использованием специфичных для платформы блоков:
// build.gradle.kts shared
kotlin {
// ...
sourceSets {
val commonMain by getting {
dependencies {
// Общие зависимости (Ktor, SQLDelight, etc.)
}
}
val androidMain by getting {
dependencies {
// Зависимости только для Android
}
}
val iosMain by getting // Пустой для нативных зависимостей iOS
val iosX64Main by getting
val iosArm64Main by getting
val iosSimulatorArm64Main by getting
}
}
Для взаимодействия с нативным кодом используются механизмы expect/actual:
// commonMain:
expect class Platform() {
fun getPlatformName(): String
}
// androidMain:
actual class Platform actual constructor() {
actual fun getPlatformName(): String {
return "Android ${android.os.Build.VERSION.SDK_INT}"
}
}
// iosMain:
import platform.UIKit.UIDevice
actual class Platform actual constructor() {
actual fun getPlatformName(): String {
return UIDevice.currentDevice.systemName() + " " + UIDevice.currentDevice.systemVersion()
}
}
Сборка iOS фреймворка выполняется с помощью Gradle таска syncFramework:
./gradlew syncFramework
Фреймворк затем интегрируется в Xcode проект.
Мне нравится подход KMM за возможность переиспользования кода без ущерба для нативного UX.