Назад к вопросам
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.