Работал ли с KMM

Ответ

Да, работал с KMM (Kotlin Multiplatform Mobile). Использовал для разделения бизнес-логики между Android и iOS. Основные модули — shared (общий код), androidApp, iosApp.

Пример:

// shared модуль
expect fun getPlatformName(): String  

// Android реализация
actual fun getPlatformName() = "Android"  

// iOS реализация (в iOS-модуле)  
actual fun getPlatformName() = "iOS"  

Плюсы:

  • Общий код для платформ
  • Снижение дублирования
  • Поддержка корутин, сериализации

Сложности:

  • Ограниченный доступ к платформенным API
  • Требуется настройка окружения для iOS
  • Debug может быть сложнее

Использовал Ktor для сетевых запросов, SQLDelight для БД.

Ответ 18+ 🔞

Ну, смотри, KMM — это такая штука, когда ты пишешь бизнес-логику один раз, а потом она, как хитрая жопа, работает и на андроиде, и на айосе. В общем, ебать копать, идея-то вроде здравая.

Вот смотри, как это выглядит на практике. Берёшь и создаёшь модуль shared. Там пишешь код, который должен быть общим. А потом, ёпта, начинается самое интересное. Ты объявляешь функцию как expect — это типа обещание платформам. А потом в каждом родном модуле делаешь actual реализацию. Получается, что общая логика — одна, а доступ к нативным пизюлькам — у каждого свой.

Вот, например, простейший кусок кода, который я не трогаю, как ты и просил:

// shared модуль
expect fun getPlatformName(): String  

// Android реализация
actual fun getPlatformName() = "Android"  

// iOS реализация (в iOS-модуле)  
actual fun getPlatformName() = "iOS"  

Видишь? В общем модуле мы ожидаем функцию, а на каждой платформе реально говорим, откуда мы. Красота, да?

Что хорошего? Ну, во-первых, овердохуища общего кода. Всю свою бизнес-логику, всю работу с данными, сетевые вызовы — всё это пишешь один раз. Не нужно плодить одни и те же баги в двух местах. Во-вторых, корутины из коробки, нормальная сериализация (Kotlinx.serialization). В общем, если проект не совсем уж мелкий, то выгода налицо.

А теперь про сложности, их тоже дохуя. Первое и главное — доступ к платформенным API. Ты не можешь из общего кода просто так взять и позвонить, или камеру включить. Для этого надо городить эти expect/actual интерфейсы, что иногда превращается в отдельный геморрой. Второе — это настройка окружения под iOS. Тут, чувак, нужно, чтобы у тебя был мак, Xcode стоял и всё было правильно сконфигурировано. Иначе проект просто не соберётся, и будешь сидеть, как дурак. И третье — дебаг. На андроиде ещё куда ни шло, а вот чтобы пройтись отладчиком по коду, который выполняется на iOS-симуляторе... это надо быть немножко шаманом.

Из библиотек, которые реально спасают — Ktor для сетевухи (удобно, родное) и SQLDelight для базы. Последний вообще красавец — пишешь SQL-запросы, а он тебе типобезопасный код генерит. Не то что эти ORM-костыли.

В общем, инструмент мощный, но не серебряная пуля. Если у тебя команда знает Kotlin и готова потратить время на первоначальную настройку и пробивание граблей — то очень даже. Если же проект на коленке делается или там сплошная нативная специфика — то можно просто охуеть от количества костылей. Решай сам.