KMP · 1 / 3

Структура KMP-проекта

Таргеты, source sets, expect/actual и интеграция с iOS

KMP компилирует общий код отдельно для настроенных таргетов модуля. Source set — набор исходников и зависимостей; target описывает платформу компиляции. Эти понятия не взаимозаменяемы. Структура проекта.

Source sets

commonMain содержит production-код для всех таргетов данного модуля, commonTest — общий тестовый код. Платформенные наборы видят доступный им общий код, но commonMain не может импортировать java.util.UUID, если модуль также собирается для iOS. Source sets.

iosMain — промежуточный набор для настроенных iOS-таргетов. Default hierarchy template создаёт подходящие промежуточные наборы на основании target-конфигурации; весь шаблон не появляется безусловно в каждом проекте. Ручные dependsOn-связи могут отключить автоматическое применение шаблона. Иерархия.

expect / actual

// commonMain/Platform.kt
expect fun platformName(): String

// androidMain/Platform.kt
actual fun platformName(): String = "Android"

// iosMain/Platform.kt
actual fun platformName(): String = "iOS"

Это три файла, а не один: разместите объявления в одинаковом package. Для каждого настроенного таргета должен находиться actual; реализацию можно разделять через промежуточный iosMain. Для заменяемого поведения часто удобен обычный интерфейс и переданный экземпляр реализации. Expected/actual declarations.

Не всякое платформенное различие требует expect/actual: для UUID общий стандартный API kotlin.uuid.Uuid стабилен с Kotlin 2.4.0, включая Uuid.random(). Отдельные новые generateV4/generateV7 API имеют собственный experimental-статус. Kotlin 2.4.0.

Что получается на выходе

Для iOS общий модуль можно подключить напрямую к Xcode или поставлять framework/XCFramework через выбранный механизм интеграции. Наличие KMP не настраивает автоматически все пути доставки. Интеграция iOS.

При экспорте через Objective-C framework suspend отображается через completion handler; Swift может предоставлять async-форму, но отмена, ошибки и наблюдение Flow требуют отдельного договора. Это описание Objective-C interop, не всех возможностей отдельного Swift export. Interop.

Общая зависимость должна поддерживать все нужные таргеты и предоставлять используемые API в общем source set. Название «multiplatform» не делает платформенные engines, драйверы и Android Context доступными в commonMain. Иерархия API, Ktor targets.

К вопросам →