Kotlin Multiplatform (KMP) — JetBrains-teknik som kompilerar gemensam Kotlin-kod direkt för iOS, Android, Web och Desktop. Till skillnad från Flutter och React Native ersätter KMP inte inbyggda UI — den gemensamma logiken läggs i en shared module och gränssnittet för varje applikation förblir inbyggt. Kotlin Multiplatform documentation — den främsta guiden för konfiguration av moduler och expect/actual-mekanismen.
Huvudpunkter
Kotlin Multiplatform — tvärkompileringsteknik som gör det möjligt att skriva gemensam kod i Kotlin och kompilera den för olika plattformar: JVM (Android), LLVM (iOS, macOS, watchOS), JavaScript (Web) och inbyggda binärer (Linux, Windows). KMP är inte ett UI-ramverk — det löser problemet med återanvändning av affärslogik, inte gränssnitt.
Arkitekturen för KMP bygger på shared module — en Gradle-modul som innehåller commonMain med plattformsoberoende kod och source sets för varje mål (androidMain, iosMain, desktopMain). Enligt JetBrains data från 2025 använder mer än 40 % av nya Kotlin-projekt KMP för att dela kod mellan plattformar.
Kotlin Multiplatform Mobile (KMM) — det tidigare namnet för mobila scenariot iOS+Android. Från och med Kotlin 2.1+ har termen KMM ersatts av allmänna Kotlin Multiplatform, eftersom tekniken har överskridit gränserna för mobil utveckling. Netflix, McDonald's och VMware använder KMP i produktion för att dela kod mellan mobila applikationer.
Expect/actual — den viktigaste mekanismen i KMP för att arbeta med plattformskod. I commonMain deklareras en expect-deklaration (funktion, klass, egenskap), och i varje plattformsspecifikt source set (androidMain, iosMain) — actual-implementeringen. Kompilatorn kontrollerar att det för varje expect finns en actual på varje målplattform.
// commonMain — deklaration av plattforms-API
expect fun getPlatformName(): String
expect class PlatformContext(val appVersion: String)
// androidMain — actual för Android
actual fun getPlatformName(): String = "Android \${Build.VERSION.SDK_INT}"
// iosMain — actual för iOS
actual fun getPlatformName(): String =
UIDevice.currentDevice.systemNameHierarki av source sets i KMP gör det möjligt att skapa mellanliggande nivåer: till exempel iosArm64Main (fysiska iOS-enheter) och iosSimulatorArm64Main (simulator) med gemensam iosMain. Kod från commonMain är tillgänglig för alla plattformar och kod från iosMain endast för iOS-mål. Detta minskar duplicering när implementeringen inte skiljer sig för varje plattform utan för en grupp av plattformar.
I praktiken används expect/actual för: att få lokal lagring (SharedPreferences vs NSUserDefaults), arbete med nätverk (HttpEngine för varje plattform), åtkomst till filsystem, kryptering och analys. JetBrains rekommenderar att man minimerar antalet expect/actual och flyttar så mycket kod som möjligt till commonMain.
Shared module — en standard Gradle-modul med plugin `org.jetbrains.kotlin.multiplatform`. Den innehåller gemensam kod i `src/commonMain/kotlin/` och plattformsimplementeringar i `src/androidMain/kotlin/` och `src/iosMain/kotlin/`. Ett KMP-projekt ansluter också `androidApp` och `iosApp`, som är beroende av shared module.
// build.gradle.kts — shared module
plugins {
kotlin("multiplatform")
id("com.android.library")
}
kotlin {
androidTarget()
listOf(
iosX64(),
iosArm64(),
iosSimulatorArm64()
).forEach {
it.binaries.framework {
baseName = "shared"
isStatic = true
}
}
sourceSets {
val commonMain by getting {
dependencies {
implementation("io.ktor:ktor-client-core:3.1.0")
implementation("org.jetbrains.kotlinx:kotlinx-serialization-json:1.7.3")
}
}
val androidMain by getting {
dependencies {
implementation("io.ktor:ktor-client-okhttp:3.1.0")
}
}
val iosMain by creating {
dependencies {
implementation("io.ktor:ktor-client-darwin:3.1.0")
}
}
}
}Konfiguration av Gradle för KMP kräver explicit angivelse av iOS-mål — x64 (Intel-simulator), arm64 (fysiska enheter) och simulatorArm64 (Apple Silicon-simulator). För varje mål genereras ett separat Apple framework. Plugin `kotlin("multiplatform")` konfigurerar automatiskt kompilering för JVM och LLVM beroende på de deklarerade målen.
Ktor och kotlinx.serialization — standard KMP-bibliotek som stöder gemensam kod. Ktor tillhandahåller en HTTP-klient med motorer för varje plattform (OkHttp för Android, Darwin för iOS). kotlinx.serialization fungerar på vilken plattform som helst utan expect/actual tack vare multiplattformsimplementeringen i commonMain.
Kotlin/Native — kompilatorn från Kotlin till inbyggd kod via LLVM. För iOS kompileras shared module till Apple framework (.framework) som ansluts via Xcode. Anrop av gemensam kod från Swift/Objective-C sker via genererade Objective-C-headers, därför måste shared modules API vara kompatibelt med Objective-C.
Begränsningar för iOS-integrering: Kotlin-collections (List, Map) konverteras till NSArray/NSDictionary. Funktioner med standardparametrar exporteras inte — overloads behövs. För suspend-funktioner genereras callback-baserade metoder med `@ObjCName` och async/await-stöd från Kotlin 2.0+.
// iOS-app: anropa shared module från Swift
import shared
class ViewModel: ObservableObject {
let repository = UserRepository()
func loadUsers() {
repository.fetchUsers(completionHandler: { result, error in
if let users = result as? [User] {
print("Users: \(users.count)")
}
})
}
}Integrering av shared module i Xcode sker via embed-and-framework — den genererade `.xcframework` läggs till i Xcode-projektet. Gradle-plugin kan automatiskt uppdatera framework vid bygge via embedAndSignAppleFrameworkForXcode. För testning på simulatorn räcker iosSimulatorArm64 eller iosX64-binär.
Valet mellan KMP, Flutter och React Native beror på prioritet: återanvändning av logik eller full multiplattform. KMP ger inbyggt UI på varje plattform men kräver två kodbaser för gränssnittet. Flutter och React Native använder ett enhetligt UI men offrar inbyggdhet.
| Egenskap | KMP | Flutter | React Native |
|---|---|---|---|
| UI-ramverk | Inbyggt (Android XML/Jetpack Compose + SwiftUI) | Dart + egen Skia-renderare | React + inbyggda komponenter |
| Gemensam kod | Affärslogik, nätverk, databas, validering | 100% förutom inbyggda plugins | 100% förutom inbyggda moduler |
| Prestanda | Inbyggd (inget mellanlager) | Hög (Skia Engine) | Medel (JSI Bridge) |
| iOS-stöd | Kotlin/Native (utmärkt) | Utmärkt | Bra |
| Ingångströskel | Medel (Kotlin + inbyggda plattformar) | Låg (ett språk + ett UI) | Låg (JS/TS + React) |
När ska man välja KMP: projektet kräver högpresterande UI (spel, kartor, animationer), befintlig inbyggd kod måste återanvändas, teamet kan redan Kotlin och inbyggda plattformar. När ska man välja Flutter/RN: MVP eller startup med begränsad budget, team med en profil, UI kräver inte djup inbyggd anpassning.
Ekosystemet av KMP-verktyg inkluderar bibliotek för alla lager av applikationen: nätverk (Ktor), serialisering (kotlinx.serialization), databas (SQLDelight), navigering (Decompose), DI (Koin) och datalagring (multiplatform-settings). JetBrains stöder Compose Multiplatform — ett UI-ramverk i Kotlin som fungerar på alla plattformar.
// Repository i KMP med SQLDelight + Ktor
class UserRepository(
private val httpClient: HttpClient,
private val db: AppDatabase
) {
suspend fun syncUsers(): List<User> {
val remote = httpClient.get("https://api.example.com/users")
.body<List<UserDto>>()
db.userQueries.replaceAll(remote.map { it.toDomain() })
return db.userQueries.selectAll().executeAsList()
}
}Compose Multiplatform — UI-ramverk för KMP baserat på Jetpack Compose. Gör det möjligt att skriva gränssnitt i Kotlin för Android, iOS, Desktop och Web. 2025 nådde Compose Multiplatform stabil status för Android och Desktop; iOS-målet är i beta. För produktionsprojekt med inbyggt UI förblir KMP:s fördel den främsta skillnaden från Flutter.
Vanliga frågor
KMM — är KMP:s mobila scenario för iOS och Android. Från och med version Kotlin 2.1+ har JetBrains slagit samman båda termerna till Kotlin Multiplatform, eftersom tekniken stöder inte bara mobila plattformar utan även Desktop och Web. KMM-projekt fortsätter att fungera men är nu en del av allmänna KMP.
Ja. KMP kompileras till Apple framework via Kotlin/Native med Objective-C-headers. SwiftUI importerar detta framework som ett vanligt bibliotek. Shared module exporterar Kotlin-klasser och funktioner som anropas från Swift med vissa begränsningar (till exempel konverteras Kotlin-collections till Foundation-typer).
På iOS testas shared module genom Kotlin/Native-tester i iosTest source set. För UI-tester används XCTest i Xcode med det importerade frameworket. Kotlin-tester skrivs i commonTest med kotlin.test och körs på iOS-simulatorn via Gradle-uppgiften iosSimulatorArm64Test.
Huvudsakliga KMP-bibliotek: Ktor (nätverk), kotlinx.serialization (JSON), SQLDelight (databas), Koin (DI), Decompose (navigering), multiplatform-settings (SharedPreferences/NSUserDefaults), Apollo GraphQL, Firebase (via KMP-NativeCoroutines). Compose Multiplatform tillhandahåller UI för alla plattformar.
Ja. KMP är fullt kompatibelt med Gradle 8.5+. Från och med Kotlin 2.1 stöder officiella plugins Gradle 8. Konfiguration via build.gradle.kts med kotlin("multiplatform") kräver Gradle 7.6+, men version 8.5 rekommenderas för optimal byggprestanda.
Sammanfattning
Vi utvecklar en mobil applikation nyckelfärdigt
IT Sectr skapar iOS- och Android-applikationer för startups och företag sedan 2017. Vi ger dig råd och föreslår den bästa lösningen.
Läs också