Uygulamanız tek bir kod tabanıyla hem HMS hem GMS yüklü cihazlara hitap etsin

Firuze Gümüş
Huawei Developers - Türkiye
3 min readDec 9, 2020

Herkese merhaba, bu yazımda Android uygulamaları geliştirirken hem HMS hem GMS servislerini kullanarak tek bir kod tabanı üzerinden nasıl ilerleyebiliriz, Huawei cihaz kullanıcılarını kullanıcı kitlemize dahil etmek için nasıl daha az kod yazarak geliştirme yapabilirize değinmeye çalışacağım.

Öncelikle HMS nedir? Henüz konuya çok hakim değilim diyorsanız buradan başlayabilirsiniz.

Uygulamamızın core layerında, HMS ve GMS için common olan ve her platformun kendine özgü featurelarını ayrı olarak ele alıyor olacağız. Bunu yaparken kod tekrarı yapmamaya, clean architecture konseptlerine sadık kalmaya çalışacağız. Bilinen bir gerçek var ki “Kod bir kere yazılır ancak defalarca okunur”.

Eğer clean ve reusable kod kavramlarının öneminden haberdarsanız tek bir kod tabanını kullanmak konusunda bana hak vereceksiniz. Böylece çok fazla boilerplate kod yazmayacağız ve kodumuz zamanla spaghetti kod olmayacak. Ayrıca bu kısmı presentation katmanından ayırmış olacaksınız ve bir sonraki projenizde de altyapınız hazır olacak.

Ben bu yaklaşımı, HMS Map Kit SDK ve Google Map SDK’i birlikte kullanarak hazırlamış olduğum sample bir proje üzerinden anlatıyor olacağım.

Talk is cheap. Lets show me the code

IPlatform : Öncelikle tahmin edebileceğiniz gibi common methodlarımız için bir interface oluşturmamız gerekecek.

IHuaweiPlatform & IGooglePlatform : Ayrıca her iki platformun kendine özgü metodları için birer interface oluşturmamız gerekecek.

HuaweiPlatform & GooglePlatform : Platform spesifik tanımladığımız classları common interfaceden implemente etmeliyiz. Her platformun kendine özgü metodları için ise yalnızca kendine özgü classları içerisinde tanımlama yapıyor olacağız. (bakınız Single-Responsibility Principle)

Platform : Platform spesifik classları tek bir yerden çağırmak içinse ayrı bir classa ihtiyacımız olacak. Ona da Platform classı diyelim. Bu class, constructorına bir IPlatform interfaceini parametre olarak alıyor olacak. Ayrıca bu classın platform spesifik classlara ait metodlar hakkında bilgi sahibi olmasına gerek duymuyoruz. Ancak bu spesifik classlarla nasıl interaction kurabileceğini bilmesini bekliyoruz.

Presentation Layer: Platform classını cihazın HMS ve GMS uyumluluğuna göre initialize edeceğiz ve ortak metodlara artık bu class üzerinden erişiyor olacağız.

Platform util classı ise cihazda hangi platformun yüklü ve kullanılabilir olacağı bilgisini bize vermeye yarıyor.

Diğer bir trick ise, her iki platformu desteklerken bazen birinde farklı diğerinde farklı propertylere sahip objelerle karşılaşabiliyoruz. Örnek verecek olursak Google Play Billing ve Huawei IAP birbirinden farklı ürün tiplerini destekliyor. Huawei Consumable, Nonconsumable and Subscription’dan oluşan 3 farklı ürün tipi desteklerken, Google inapp ve subs propertylerinden oluşan iki ürün tipini destekliyor. Her iki platformu desteklemek için kendiniz bir ürün tipi objesi oluşturarak bu ürün tipiyle Google ve Huawei’e özgü ürün tipleri arasında mapping yapabilirsiniz. Böylece local databaseinize ya da servisinize kendi oluşturduğunuz ürün tipini gönderirken, Huawei ve Google’a ait apilara erişirken ilgili objeden platformlara ait objelere dönüştürme işlemine gidebilirsiniz. Mapping için bazı extension classlar yazabiliriz. Kimileri extension classları “syntactic sugar” olarak nitelendirse de, eminim clean architecture severler benim gibi extension kullanımı seviyor.

Ürün tiplerini maplemek için basit bir extension örneği:

Ve sonuç:

Google Map SDK — HMS Map Kit SDK

--

--