Kotlin Multiplatform Mobile (KMM)

Naci özyıldırım
inventiv
Published in
4 min readJan 19, 2022

Merhabalar, bu yazıda Kotlin Multiplatform Mobile’dan bahsedeceğiz ve basit bir başlangıç uygulaması yazacağız.

from kotlinlang.org

Kotlin Multiplatform Mobile Nedir?

Kotlin Multiplatform Mobile, Kotlin ile iOS ve Android uygulamaları için ortak kodlar yazılmasına olanak sağlayan bir SDK’dır. Arayüz kısmı haricinde, business logic’lerin ortak bir codebase’de toplanmasına olanak sağlar. Kotlin Multiplatform Mobile ile ortak kullanılacak kodları iOS ve Android ile paylaşılabildiği gibi platforma özgü kodlar da yazılabilir.

Arayüz ayrıca geliştirilecekse, ortak kod mantığı kullanmanın faydası nedir?

Tam bir hibrit mantık gibi çalışmayan bu yapı native ve hibrit arasına konumlanmıştır. Hibrit yapıda arayüz geliştirmelerinde native componentler’in kullanılamaması sebebiyle birçok arayüz elemanı mevcut veya güncel olmamaktadır. Fakat KMM ile arayüz tarafında native componentler veya güncellemelerden geride kalmaksızın, iOS ve Android uygulamalarının iş akışı süreçleri tek bir yerde geliştirilip yönetilebilir.

İlk KMM uygulamamızı geliştirmeye başlayalım

Gereksinimler

  • KMM projesi Android Studio ile çalıştırılabilir. Bundan dolayı Android Studio 4.2 ya da 2020.3.1 Canary 8 veya üzeri bir versiyonun yüklü olması gerekir.
  • iOS spesifik kodları yönetebilmek için Xcode 11.3 ve üzeri bir versiyon kurulu olması gerekir.
  • Eğer kurulu değilse JDK’nın da kurulu olması gerekir.

Projenin Oluşturulması

  1. Android Studio’da Kotlin Multiplatform Mobile plugin’ini kurun.

Android Studio’yu açın, Plugins altında Marketplace sekmesine tıklayın ve “KMM“ ile bir arama yapın. Kotlin Multiplatform Mobile plugin’ini kurun ve Android Studio’yu yeniden başlatın.

2. Android Studio’da New Project’ i seçin.

3. Açılan ekranda KMM Application’ı seçin ve devam edin.

4. Projenin ismi, paket adı gibi bilgilerini belirleyip devam edin.

5. Açılan ekranda son ayarlar yapılıp uygulama oluşturulacaktır. Örnek unit test yazılı olması istenilirse “Add sample tests for Shared Module” checkbox’ı seçilmelidir. Örnek proje amaçlı “iOS framework distribution” olarak Regular framework seçilip kurulum tamamlanır.

6. Proje oluşturulduktan sonra dosyalar aşağıdaki gibi görünecektir.

7. Uygulama çalışmaya hazır hale geldi. Çalıştır butonu ile iOS veya Android özelinde uygulama çalıştırılabilir.

Platform bazlı API’ların kullanılması

Ortak modülün içerisinde her platforma özel API’lar kullanılabilmekte ve bu sayede kodun ayrıştırılmasına gerek olmamaktadır. UUID üretimi Android ve iOS için farklı kütüphaneleri içeren özel bir süreç olduğu için örnek olarak bu işlemi ele alacağız.

Bu işlemi gerçekleştirebilmek için interface ve class yapısına benzer bir yapı kullanılmaktadır. Ortak modül üzerinde interface’e benzer şekilde expect değerler oluşturulur. Bu değerlerin içinin doldurulması ise iOS ve Android modülleri içerisinde actual terimi ile override mantığına benzer şekilde yapılır.

from https://kotlinlang.org/docs/kmm-connect-to-platform-specific-apis.html

Derleyici, ortak modülde expect anahtar sözcükle işaretlenmiş her bildirimin, tüm platform modüllerinde actual anahtar sözcükle işaretlenmiş karşılık gelen bildirimlere sahip olmasını bekler. IDE, bu kontrolü yapıp eksik tanımlamalarda hata gösterir.

Kod üzerinde tanımlanması

  1. UUID üretimi için “commonMain” dizininde beklenen değer için Utils.kt sınıfı ve bu sınıfta tanımlı bir fonksiyon oluşturulur.
expect fun generateUUID(): String

2. Aynı sınıf Utils.kt olarak “iosMain” dizininde oluşturulup değere atama yapılır.

import platform.Foundation.NSUUIDactual fun generateUUID() = NSUUID().UUIDString()

3. Aynı sınıf Utils.kt olarak “androidMain” dizininde oluşturulup değere atama yapılır.

import java.util.*

actual fun generateUUID() = UUID.randomUUID().toString()

Bu şekilde generateUUID metodunun içi platform bazlı kütüphanlere göre doldurulmuş olur.

from https://kotlinlang.org/docs/kmm-connect-to-platform-specific-apis.html

Bu fonksiyon common modül “commonMain” üzerinden sunulabilir.

class Greeting {
fun greeting(): String {
return "Hello, ${Platform().platform}!\nMy unique id is ${generateUUID()}"
}
}

Android ve iOS tarafında bu metod çağırılarak işlem yapılabilir.

Android için => MainActiviy.kt

import com.test.myapplication.Greeting

fun greet(): String {
return Greeting().greeting()
}
class MainActivity : AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)

val tv: TextView = findViewById(R.id.text_view)
tv.text = greet()
}
}

iOS için =>

import SwiftUI
import shared
struct ContentView: View {
let greet = Greeting().greeting()
var body: some View {
Text(greet)
.multilineTextAlignment(.center)
.foregroundColor(Color.red)
}
}
struct ContentView_Previews: PreviewProvider {
static var previews: some View {
ContentView()
}
}

Uygulamayı çalıştırdığımızda ekran görüntüleri aşağıdaki gibi olacaktır.

Testlerin çalıştırılması

Yazılan ortak modül için testler koşulabilir.

from https://kotlinlang.org/docs/kmm-create-first-app.html#run-tests-on-ios

Sonuç

Bu yazıda kurulum ve basit bir uygulama yaptık. Bunun ilerisinde ortak modül kullanımı için çok daha fazla alan vardır. Mesela Android ve iOS için ViewModel yapıları çok benzerlik göstermektedir. Bu sebeple uygulamadaki tüm ViewModel’ler KMM ile ortak modüle taşınabilir. Bu geliştirme aşamasında veri depolama için SQLDelight ağ bağlantısı katmanı için Ktor kullanılabilir.

Referanslar

Yazıya destekleri için Ramazan Oz ve Yiğit Bozkurt a teşekkürler.

--

--