Merhaba, ben adesso Mobile ekibinden Boran Aslan, bir önceki yazımda Kotlin Multiplatform Mobile’in cross-platform’a nasıl farklı bir bakış getirdiğinden ve yazılım süreçlerimizi nasıl değiştirebileceğinden bahsetmiştim. Bugün ise işin biraz daha teknik tarafında olacağız ve KMM ile adım adım yeni bir proje nasıl geliştirilir onu inceleyeceğiz.
Odaklanmak istediğimiz konu, ortam kurulumu ve KMM ile nasıl kod paylaşabileceğimizi görmek olduğu için geri kalan her şeyi çok basit tutacağız. Uygulamaların maksimum kodu paylaşabileceği gelişmiş mimariler, birim testleri, hata yakalama ve bunun gibi birçok başlığı sonraki yazılara saklayacağız. Peki uygulamalarımız ne yapacak gelin ona bakalım.
Bu projemizde TMDb API yardımıyla iki platform için birer film uygulaması geliştireceğiz. Uygulamalarımız iki sayfadan oluşacak, ilk sayfada popüler filmler listelenecek ve detay sayfasında da filmin posteri ile açıklama yazısı görüntülenecek.
Önce Biraz Teori
Uygulamamızı geliştirmeye başlamadan önce KMM hakkındaki teorik bilgimizin bir kez daha üstünden geçelim. Mobil uygulamalarda kullanılan modern yazılım mimarileri katmanlardan oluşur. Bu katmanların her birinin belirli rol-sorumlulukları vardır ve diğer katmana gerektiği kadar bilgi taşırlar. Bu katmanların temel amacı, uygulamamıza yeni özellikler eklemek ya da mevcut özellikleri değiştirmek istediğimizde işimizi kolaylaştırmaktır. Mobil uygulamalarda sıklıkla kullandığımız katmanlara aşağıdaki örnekleri verebiliriz.
Veri Katmanı (Data): Veri tabanı ya da API çağrıları ile verileri elde ettiğimiz katman.
İş Mantığı Katmanı (Business Logic): Elde ettiğimiz verileri işlediğimiz katman.
Sunum Katmanı (Presentation-UI): Verilerin ekranda nasıl görüntüleneceğinin belirlendiği katman.
KMM’nin amacı, veri ve iş mantığı katmanlarında yaptığınız geliştirmeleri tamamen, sunum katmanındaki geliştirmeleri de kısmi olarak iki platform arasında paylaşabilmenizi sağlamaktır. Bu sayede hem bakım-geliştirme masraflarından tasarruf edip hem de uygulamalar arasındaki tutarlılığı artırmanıza yardımcı olur. Bugün ise bu kısımlardan sadece veri katmanına odaklanıp geri kalanını bahsettiğim gibi sonraki yazılara bırakacağız.
Artık Pratiğe Geçebiliriz
Teorik kısımlardan yeterince bahsettiğimize göre uygulamamızı geliştirmeye başlayabiliriz. Uygulama geliştirmeye başlamadan önce yapmamız gereken ilk iş geliştirme ortamlarını kurmak.
Ortam Kurulumu
Öncelikle hem iOS hem de Android uygulaması geliştirmek istiyorsanız, iOS projesinin derlenmesi için bir Mac bilgisayara ihtiyacınız olacak. Ben sadece Android uygulaması ve paylaşılan kısımlar ile ilgileniyorum derseniz istediğiniz herhangi bir bilgisayarda geliştirme yapabilirsiniz.
Android Studio: 4.0 versiyonu üstünde bir versiyon kullanılması gerekiyor, ben 4.12 kullandım.
Xcode: 11.3.1 üstü sürümler destekleniyor, ben 12.0 kullandım.
Kotlin Plugin: 1.4.20 ya da üzeri gerekiyor, benim kullandığım versiyon 1.4.21
Kotlin Multiplatform Mobile Plugin: Sürekli geliştiği için en güncel versiyonu kullanmakta fayda var, benim kullandığım versiyon an itibariyle 0.2.0-release-65-Studio4.1.
JDK: Bilgisayarınızda hali hazırda kurulu değilse kurmanız gerekiyor.
Yeni Proje
Yeni bir projeye başlamadan önce KMM Plugin’inini kurmanız gerekiyor. Bunun için yapmanız gereken Android Studio’da Preference -> Plugins -> Marketplace (Tab) kısmında KMM’yi bulmak ve en güncel sürümünü kurmak.
Eğer kurulumda bir sorun yaşamadıysanız File -> New Project dediğinizde Template’ler arasında KMM Application seçeneğini görüyor olmanız gerekiyor. Göremiyorsanız birçok konuda olduğu gibi Android Studio’yu kapatıp açmak burada da yardımcı olabilir.
KMM uygulamasını seçtiğinizde projenizin adını ve paket adını belirleyebileceğiniz bir ekran ile karşılacaksınız. Örnek uygulamam popüler filmleri listeleyeceği için ben adını MoveeKMM olarak belirledim. Next ile bir sonraki adıma geçtiğinizde de iOS, Android ve paylaşılan uygulamalarınızın adını belirlemenizi isteyecek, burada çok belirli bir ihtiyacınız yoksa önerilen isimlerle devam edebilirsiniz.
Bu aşamaya kadar her şey yolunda gittiyse ilk KMM projeniz geliştirilmeye hazır demektir. Test etmek için run configuration kısmından iosApp ve androidApp hedeflerini ayrı ayrı seçerek çalıştırabilirsiniz.
İki hedefi de çalıştırdığınızda, uygulamanın yüklendiği cihazların versiyonlarıyla sizi selamlayan ekranlar ile karşılaşacaksınız.
Şu ana kadar yaptığımız kısma bir kez daha göz atalım ve bu uygulamalar ne kadar kodu paylaşıyor inceleyelim. Uygulamanın şu aşamada yaptığı çok temel iki şey var, uygulamanın hangi cihaz üzerinde çalıştığını anlamak ve o bilgi ile bir mesaj oluşturmak. Aşağıda shared kısmında gördüğünüz Greeting ve Platform sınıfları da tam olarak bu işleri yapıyor ve iki uygulama arasında paylaşılıyorlar.
Movee App!
Kurulum aşamasını tamamladığımıza göre artık uygulamamıza özel kısımlara geçebiliriz. İlk önce uygulamamızı geliştirirken hangi kütüphanelerden faydalanacağız onlara bakalım.
Kullanacağımız Kütüphaneler
Shared
Ktor: HTTP çağrıları için kullanacağımız kütüphane.
kotlinx.serialization: API’den aldığımız cevapları serileştirmek için kullanacağımız kütüphane.
kotlinx.coroutines: Asenkron yapacağımız işler için yararlanacağımız kütüphane.
Android
Glide: Medya dosyalarını kolayca indirmek ve saklamak için kullanacağımız kütüphane.
iOS
Longinus: Medya dosyalarını kolayca indirmek ve saklamak için kullanacağımız kütüphane.
Paylaşacağımız (shared) projemizdeki bağımlılıklarımızı ekleyerek başlayalım. Bunun için shared altındaki build.gradle dosyasını aşağıdaki kod örneğindeki gibi düzenlememiz gerekiyor.
Burada dikkat etmemiz gereken kısımlar commonMain, androidMain ve iosMain altına eklediğimiz paketler. O gruba eklediğimiz bağımlılıklar uygulamamızın paylaşılan kısmında kullanacaklarımız olacak. Bir diğer dikkat çekmek istediğim kısım da packForXcode, bu kısım iOS ortamında kullanacağınız statik Framework’u derliyor ve projede gereken yere kopyalıyor.
Bu kısımda ayrı bir parantez açıp bu proje sırasında beni zorlayan bir konudan bahsetmek istiyorum. Henüz hem KMM hem de ona özel geliştirilen kütüphaneler alfa aşamasında olduğu için birbirleri ile uyumları konusunda ciddi sorunlar yaşanabiliyor. Hepsi stabil hale gelene kadar uyumlu versiyonları yakalamak için bir miktar çaba harcamanız gerekebilir.
Paylaşılan Network Katmanı
Aşağıdaki kod parçasında paylaşacağımız network kısmını görebilirsiniz. Gördüğünüz gibi ne yaptığını uzun uzun anlatmama gerek kalmayacak kadar sade.
Android Uygulamasından Kullanım
Bir önceki yazıda da belirttiğim gibi Android geliştiricileri için KMM kendi evlerinde maça çıkmak gibi. Aşağıdaki kod örneğinde göreceğiniz gibi aynı projede Ktor ile geliştireceğiniz bir network katmanını çağırmaktan hiç bir farkı yok.
iOS Uygulamasında Kullanım
KMM, iOS uygulaması ile bilgi paylaşmak için arka tarafta bir büyü yapmıyor. Yaptığı şey paylaşılan modülü yukarıda gördüğünüz packForXcode script’i ile statik bir kütüphane olarak derleyerek iOS projesine eklemek. Bu yüzden de KMM ile geliştirdiğimiz kodları kullanmak herhangi bir kütüphane kullanmaktan farklı değil. Aşağıdaki kod örneğinde bunu görebilirsiniz.
Native taraflarda arayüz geliştirmelerini tamamladıktan sonra KMM ile network katmanını paylaştığınız ilk uygulamanız hazır.
Bu yazıda yeni bir proje nasıl yaratılır, bağımlılıklar nasıl eklenir ve basit bir network katmanı nasıl paylaşılır onları gördük. Uygulamanın tamamını incelemek için kaynak kodlara buradan ulaşabilirsiniz.
Tabii ki KMM’nin yetenekleri bunlarla sınırlı değil ve gerçek bir projede karşımıza çıkacak olası sorunların bir kısmı adreslenmiş durumda.
Test: Paylaşılan kısımda yazdığınız kodlar için Kotlin’den aşina olduğunuz kütüphaneler ile birim ya da entegrasyon testlerini yazabilirsiniz.
iOS/Android Farkları: Kodunuzun platform spesifik olarak farklı olduğu noktalarda expect/actual mantığı ile derleyiciye ilgili kısmın native tarafta ele alınacağını söyleyebiliyorsunuz.
Cocoapods: Eğer kendinizi daha rahat hissediyorsanız, bağımlılıklarınızı Cocoapods ile yönetebilirsiniz. (İlk denememde bir hata ile karşılaştığım için çok zorlamadığımı belirteyim yani hala çok stabil değil.)
Mevcut uygulamalara entegrasyon: En büyük avantajlarından biri de mevcut uygulamalarınız ile kolay entegre olabilmesi.
Bu ilk test sürüşü sonrasındaki görüşüm; gelişime açık birçok noktası olmasına rağmen hala çok pozitif. İlerleyen süreçte gelişmeleri yakından takip edeceğim ve ciddi bir projedeki katkılarını görmek için sabırsızlanıyorum.