Kotlin Multiplatform Nedir?
Kotlin Multiplatform (KMP), Kotlin kodunu birden fazla hedefe derler: Android için JVM, iOS için Kotlin/Native, web için JavaScript veya WebAssembly. Flutter ve React Native'den farklı olarak KMP sizi ortak bir UI'a zorlamaz; tek bir networking modülünden tüm uygulamaya kadar ne kadarını paylaşacağınızı siz seçersiniz.
KMP 2023 sonundan beri stable ve Google, Android ile iOS arasında business logic paylaşımı için KMP'yi resmi olarak destekliyor. Ekim 2026 itibarıyla en güncel stable Kotlin sürümü 2.4.21; 2.5.0 ise Aralık 2026 için planlanıyor.
Neyi Paylaşmalı, Neyi Native Bırakmalı?
| Katman | Genelde paylaşılır mı? | Not |
|---|---|---|
| Domain modelleri ve iş kuralları | Evet | Saf Kotlin, en kolay kazanım |
| Networking ve serialization | Evet | Ktor + kotlinx.serialization |
| Yerel depolama ve cache | Evet | SQLDelight, Room, DataStore |
| ViewModel ve state | Çoğunlukla | Jetpack ViewModel ve Lifecycle KMP destekliyor |
| UI | Opsiyonel | Native UI veya Compose Multiplatform |
| Platform API'leri (kamera, ödeme, widget) | Nadiren | Interface arkasına alın |
Yaygın başlangıç "ortak logic, native UI" modelidir: Android'de Jetpack Compose, iOS'ta SwiftUI, altta tek Kotlin modülü.
Compose Multiplatform
Compose Multiplatform (CMP), JetBrains'in Jetpack Compose tabanlı deklaratif UI framework'üdür. 6 Mayıs 2025'te yayınlanan Compose Multiplatform 1.8.0 ile iOS desteği stable oldu. Ekim 2026 itibarıyla güncel seri 1.12 (1.12.2, Ekim 2026'da yayınlandı).
| Platform | KMP core | Compose Multiplatform |
|---|---|---|
| Android | Stable | Stable |
| iOS | Stable | Stable |
| Desktop (JVM) | Stable | Stable |
| Web (Kotlin/Wasm) | Beta | Beta |
CMP, iOS'ta UIKit bileşenleri yerine Flutter gibi kendi UI'ını çizer. SwiftUI uygulamasında bir Compose ekranı açabilir ya da Compose içine native iOS view'ları gömebilirsiniz.
Proje Yapısı
Tipik bir KMP projesinde, platform başına source set içeren bir shared modül bulunur:
shared/
src/commonMain/ // tüm platformlar için ortak kod
src/androidMain/ // Android'e özel implementasyonlar
src/iosMain/ // iOS'a özel implementasyonlar
androidApp/ // Android uygulaması
iosApp/ // Xcode projesi
expect/actual
Ortak kodun bir platform API'sine ihtiyacı olduğunda commonMain'de expect tanımlanır, her platform source set'inde actual karşılığı yazılır. expect/actual fonksiyon ve property'ler stable; expect/actual class'lar ise hâlâ Beta. Resmi öneri, interface + factory fonksiyonu kullanmak:
// commonMain
interface Platform { val name: String }
expect fun getPlatform(): Platform
// iosMain
actual fun getPlatform(): Platform = object : Platform {
override val name = UIDevice.currentDevice.systemName()
}
Temel Kütüphaneler
| İhtiyaç | Kütüphane |
|---|---|
| Asenkron işler ve stream'ler | kotlinx.coroutines (suspend, Flow) |
| JSON | kotlinx.serialization |
| HTTP | Ktor client (Android'de OkHttp, iOS'ta Darwin engine) |
| SQL veritabanı | SQLDelight veya Room (KMP) |
| Key-value depolama | DataStore (KMP) |
| Dependency injection | Koin |
| Tarih ve saat | kotlinx-datetime |
| Mimari | Jetpack ViewModel, Lifecycle, Navigation (KMP sürümleri) |
Bir kütüphanenin iosArm64 ve iosSimulatorArm64 dahil tüm hedefleriniz için artifact yayınladığını kontrol edin.
iOS Entegrasyonu
Shared modül bir Apple framework'üne derlenir. Xcode'daki bir Gradle build phase ile doğrudan entegre edebilir ya da XCFramework olarak Swift Package Manager ile dağıtabilirsiniz.
Objective-C Köprüsü
Kotlin, varsayılan olarak API'sini Swift'e Objective-C header'ları üzerinden açar. Bazı Kotlin özellikleri bu köprüde iyi karşılanmaz: sealed class'lar Swift enum'ına dönüşmez, Flow için wrapper gerekir.
Touchlab'in SKIE plugin'i bu çıktıyı iyileştirir: sealed class'lar exhaustive Swift enum'larına, suspend fonksiyonlar async'e, Flow'lar AsyncSequence'e dönüşür. SKIE'nin yeni Kotlin sürümlerine desteği gecikebilir; Kotlin'i yükseltmeden önce uyumluluğu kontrol edin.
Swift Export
Swift export, Objective-C katmanı olmadan doğrudan Kotlin'den Swift API'si üretir. Ekim 2026 itibarıyla resmi dokümanda Alpha olarak listeleniyor: yalnızca direct integration ile çalışıyor, generic'lerde kısıtları var ve breaking change bekleniyor. Roadmap'te Beta'ya geçiş hedefi var. Denemeye değer, ancak production için şimdilik varsayılan köprüde kalın.
KMP, Flutter ve React Native Karşılaştırması
| Kotlin Multiplatform | Flutter | React Native | |
|---|---|---|---|
| Dil | Kotlin | Dart | JavaScript / TypeScript |
| UI | Native veya Compose Multiplatform | Kendi rendering engine'i | Native bileşenler |
| Paylaşılan kısım | Tek modülden tüm uygulamaya | Genelde tüm uygulama | Genelde tüm uygulama |
| Mevcut native uygulamaya ekleme | Kademeli, modül modül | Mümkün, daha az yaygın | Mümkün, daha az yaygın |
| Android çıktısı | Normal Kotlin/JVM kodu | Dart runtime + engine | JS runtime + native modüller |
| iOS ekibinin deneyimi | Swift, Kotlin framework'ünü çağırır | Çoğunlukla Dart | Çoğunlukla JS/TS |
KMP Ne Zaman Seçilmeli?
- Elinizde Kotlin ile yazılmış bir Android uygulaması var ve logic'i iOS'ta da kullanmak istiyorsunuz.
- Her platformda native UI istiyor, iş kuralları için tek bir kaynak arıyorsunuz.
- Ekibiniz Kotlin'de güçlü; iOS UI'ı yine Swift geliştiricileri sahiplenebilir.
- Ortak UI'ın zorlaştıracağı derin platform entegrasyonları gerekiyor.
Sıfırdan başlayan, tek UI kod tabanı isteyen küçük bir ekip için Flutter veya React Native daha basit olabilir.
Mevcut Android Uygulamasını Taşıma
- Saf Kotlin kodu ayırın. Model, validation ve use case'leri Android import'u içermeyen bir
sharedmodüle taşıyın. - Android'e bağımlı kütüphaneleri değiştirin. Retrofit yerine Ktor, Gson/Moshi yerine kotlinx.serialization,
java.timeyerine kotlinx-datetime kullanın; persistence'ı Room KMP veya SQLDelight'a taşıyın. - Tek bir iOS özelliği yayınlayın. Shared modülü iOS'ta tek bir akış için kullanın; build süresini, binary boyutunu ve Swift API ergonomisini ölçün.
- Kademeli genişletin. Sırada repository ve ViewModel'ler var; Compose Multiplatform ekranlarını sonraya bırakın.