Android uygulama içi para kazanma (IAP)

Uzun bir aradan sonra "merhaba" diyerek android ortamından para kazanma yazılarıma devam ediyorum. Reklam kazançlarından sonra asıl kazanç kapısı olan, bazı firmaların milyar dolar kazanç sağladığı, paralı uygulamalar ve bedava olup uygulama içi ürün satan (freemium) uygulama içi gelir modeline göz atacağız. Önceki yazılarımı merak edenler için;


Bu yazımda uygulama içi gelir modeline odaklanacağım. Çünkü henüz paralı uygulamayı deneyecek bir fikir aklıma gelmedi. Öncelikle itiraf etmeliyim ki, uygulama içi satışı sadece "bu yolla para kazanabilir miyim?" sorusuna cevap aramak için deniyorum. Öyle çok bir beklentim yok çünkü henüz uygulama içi ürün satışını ciddi manada gerektirecek bir uygulama fikri aklıma gelmiş değil.

İnsanlara bir şey satmak, ya da satılan ürünün gerekliliğini göstermek bence hiç de kolay bir iş değil. O nedenle üst paragrafta "ciddi manada" kelimelerini kullandım. Bir uygulama içerisinde satacağınız ürünü müşterinin beğenmesi, ürünün hakettiği fiyata sahip olması ve müşterinin "bunu almam lazım" ya da "alayım bunu ne olacak ki" demesi gerekir diye düşünüyorum. Aksi takdirde siz ne kadar para ürün koyarsanız koyun, kendinize güvenip ne kadar çok kazanırım diye düşünüp dururken zaman geçer ve tek kuruş kazanamazsınız.

Proje olarak öncelikle ne yapmam gerektiğini düşündüm ve biraz araştıma yaptım. Market ve internet araştırmaları sonucunda uygulama içi satışta büyük pastanın oyunlarda olduğu su götürmez bir gerçek. Açıkçası henüz oyun yapamadığımdan, büyük pasta şu an için bana birşey ifade etmediği için hedef olarak ürün satışı yapabileceğim bir uygulama fikri gerekiyordu. Market araştırması sonunda daha önceleri başka birisi için yaptığım gelir-gider hesabını tutan uygulamayı seçtim.

Uygulamam büyük oranda hazırdı. Uygulama içi satış imkanı verecek kütüphaneleri ve satışı yapılacak ürün özelliklerini ekleyerek farklı bir uygulama formatına dönüştürmem gerekti ve ortaya "Kasa Defterim" uygulaması çıktı.

Benzer uygulamaları incelediğimde bazı özellikleri paralı olarak sunduklarını gördüm ve ben de buna göre uygulama içerisinde 4-5 özelliği kullanma imkanı verecek tek bir satın alma seçeneği ekledim ve buna da "PRO" versiyon dedim. Kütüphaneleri nasıl ekledim sorusuna gelecek olursam;

InAppBillingService.aidl isimli bir dosya var. Bu dosyayı uygulamanıza eklemeniz gerekecek. .Net ile kod yazanlar için wsdl tarzında bir dosya diyebilirim. Dosyayı ekledikten sonra google örneklerinde geçen ve aidl dosyasındaki fonksiyonlarını kullanıp satın alma, tüketme, kontrol etme gibi örnekleri içeren java dosyalarının hepsini proje içerisine aldım ve gerekli gördüğüm yerleri (ürün tanımlamalarını) değiştirdim. Belki ilerleyen zamanda sadeleştirebilirim ama şu anda işimi gördü diyebilirim.

Kod tarafında ekleme yaptıktan sonra kod içerisinde satmak istediğiniz nesnenin (isimlendirmeye dikkat etmeniz gerekir) Google Play geliştirici konsolunda tanımlanması ve aktif edilmesi gerekir.
Google Play geliştirici konsolu yardımıyla uygulama içerisinde satacağınız nesneleri ve fiyatlarını belirleyebiliyorsunuz. "Managed" ve "Subscription" olmak üzere iki türlü nesne var.
  • "Managed" nesneleri direk satış olarak nitelendirebiliriz. Hatta bu özellikteki nesneler için tüketme işlemi de uygulayabilirsiniz. Oyunlardaki altın satışını buna örnek verebiliriz. Altını alırsınız harcarsınız. Sonrasında tekrar alabilirsiniz.
  • "Subscription" tipi nesneler için üyelik modelini içeriyor. Bu modeli seçtiğinizde süre belirlemenizi istiyor. Üyelik modeliyle çalışan veri akışlı (streaming) uygulamalar (spotify, deezer) için belirlenmiş bir satış modeli diyebilirim.

Marketi incelediğinizde uygulamalar için "PRO" versiyonların ayrı olduğunu görebilirsiniz. Eskiden tercih edilen bu yöntem freemium modelinin daha efektif satış yapması farkedilince terkedilmeye başlandı. Artık pro ya da premium modeller uygulama içerisinde satın alınarak hem marketteki uygulama kalabalığının önüne geçilmek istendi hem de kullanıcı aynı uygulamayı ek özelliklerle kullanmaya devam etti. Ben de "Managed" türünde PRO ismi altında bir ürün belirledim.

Satacağınız nesnenin tipini seçtikten sonra fiyat belirlemeniz isteniyor. Ana para birimine göre (benim için TL) tümünü ayarlayabilir ya da tek tek ülke bazında fiyatlandırma yapabilirsiniz. Ben ana para birimi bazında fiyatlandırmayı seçip, fiyatlar ayarlandıktan sonra bazı ülkeler için değişiklikler yaptım.



Bu arada kısa bir not olarak geliştirici konsol gmail hesabı ve geliştirici konsola eklediğiniz diğer hesaplar test hesabı olarak kabul ediliyor. Bu hesaplarla kullanılan android cihazlardan satın alma yaptığınızda hesabınızdan para tahsil edilmiyor.

Geliştirici konsolu tarafında ilk kez bir ücretli ürün ekliyorsanız sizden "Merchant" hesabı oluşturmanızı isteyecek. Kazanacağınız para ve satınalma detaylarını bu hesap ile takip edeceksiniz.



Kodu ekledik, konsol ayarlamalarını yaptık ve uygulamamızı markete attık. Artık uygulamanızdan para kazanmayı unutabilirsiniz. Gerçekten öyle oluyor. Uygulama içi satın alma seçeneği olan uygulamalarda, kullanıcı uygulamayı zaten kullanabildiği için ne kadar indirildi ne kadar tıklanıldı gibi takip etmeyi gerektiren bir durum yok.

Örneğin ben Kasa Defterim uygulamasını markete gönderdikten sonra birkaç gün merchant hesabına baktım sadece benim test için yaptığım işlemler görünüyordu. Sonra bakmamaya başladım ve bir gün google'dan içerisinde payment içeren bir mail geldi. Merchant hesabımı banka hesabımla bağlamadığımdan gelen parayı nereye göndereceğim diye bana mail atmış. Gelen para da öyle düşündüğünüz gibi birşey değil 24TL :)

15 lira ücret belirlediğim uygulamadan iki satış sonunda 30.55TL kazanmışım. O 55 kuruş nereden geldi diye sorabilirsiniz ki ben de sordum. Merchant hesabını incelediğimde Endonezya'dan bir kişinin uygulamayı satın aldığını gördüm. Ülke bazında fiyatları yeninden ayarlamamdan kaynaklı Endonezya para biriminde 0.55 liralık bir fark oluşmuş. Güzel de olmuş :) Tabi Google payını düşünce (%30) bana 24TL kalmış.

Sonrasında "Araç Yönet" isimli araçlarınız için gelir-gider, bilgi ve hatırlatmaları içeren başka bir uygulama daha geliştirip aynı mantıkla markete gönderdim. Tabi bu arada tüccar (merchant) hesabına aylık 100TL altında göndermemesi için emir verdim. Aradan 3-4 ay geçmiştir bu sürede hiçbir ödeme almadım. Geçenlerde meraktan hesabıma baktığımda Araç Yönet uygulamasının iki tane sattığını gördüm.

Sonuç olarak uygulama içi satışlardan gerçekten para kazanılıyormuş :) tabi kazandığınız para emeğinizle doğru orantılı olmayabilir. Dikkat edilecek nokta ise hazırlayacağınız uygulamanın dil desteği yani farklı ülkelerde indirilebilecek bir uygulama olmasıdır. Oyun içi ürün satışından milyar dolar kazanan firmaların olduğu bir ortamda size de bol kazanç düşmesi dileğiyle...


Android uygulamadan para kazanmada farklı reklam firmaları

Herkese selam diyerek bu seferki yazıma başlayabilirim. Aşağıdaki yazılarımda Android (aslında mobil) uygulama geliştirirken nasıl para kazanacağımızdan kısaca bahsetmiştim.

Bu sefer ki yazımızda yine reklamcılık üzerinden para kazanmaya devam edeceğiz. Admob (Google) reklamcılığına ek olarak bu sefer AdBuddiz ve Vungle ile bu konuyu biraz daha açıklayacağım. 2014 Haziran ayının başında Google geliştiricilere bir mail atarak, bundan sonra yerel para kodlarını kullanacağını belirtti ve domain adında değişikliğe gitti. Hal böyle olunca Temmuz ayında yeni ödeme şeklini kabul edip yeni kontrol paneline geçmiş bulundum.

Öncelikle şunu söyleyeyim ki başlangıçta yadırgadığım, kontrol paneli ile Google Admob ve Adsense 'i birleştirme yoluna gitmiş. Size yeni Admob panelini açarken aslında bir Adsense hesabını da açmış oluyor ve gelirleri Adsense hesabından takip etmenize olanak sağlıyor. Yeni panele geçmeden önce forumlar sürekli bahsedilen TL hesabına geçince gelirlerde azalma oluyor konusunu yaşamadım. Hatta yeni panelden midir anlayamadım ama gelirlerde bir artış olduğu da kesin.

Google 'ın Admob üzerindeki yeni geliştirmeleri devam ederken mail hesabıma sürekli gelen "bizi deneyim biz daha çok tık başı para veriyoruz" şeklindeki maillerden birisi için artık dayanamayıp deneme kararı verdim.

Seçtiğim firma Adbuddiz oldu. Bu ismi bile zor söylenen firma için özel bir tercih nedenim olmadı. Tam sayfa reklam verebilme imkanı ile kolay entegrasyonu görünce denemek istedim. Gerekli SDK 'yı projeye ekledikten sonra  ufak bir kodlama ile uygulama içerisinde reklamı çalışır hale getirdim. Play Store uygulamalarında fazlaca reklama boğulmuş, kenarından köşesinden reklam fırlayan uygulamalardan ben de bunaldığım için sadece çıkış ekranına deneme amaçlı tam sayfa reklam koydum. Kullanıcı Home tuşuyla da uygulamadan çıkabildiği için belki  de hiç görülemeyecek bir reklam ekranı olmuştu. Birden fazla uygulamama bu şekilde yerleşim yaptıktan sonra Adbuddiz performans analizini sizinle paylaşmak istiyorum;

Adbuddiz dashboard

  1. Reklamı getirecek kodun uygulaması oldukça basit
  2. Google dışı gelir arayanlar için tercih edilebilir
  3. Paypal üzerinden%0.2 kesinti ile ödeme aldım
  4. Tam sayfa (interstitial) reklamcılık google için de geldi. Neden tercih edeyim sorusunun cevabı yok.
  5. Daha fazla para verdiği söylüyor ama bana pek inandırıcı gelmedi
  6. 100$ limit sonrası ödeme için NET45 (kazandığından 45 gün sonra) zaman aralığı koyuyor, Admob yeni panelle birlikte NET20-25 aralığına düşürdü.
Diğer bir reklamcılık kanalı olan Vungle ile tanışmamız biraz daha farklı oldu. Oynadığım oyunların bazılarında ek özellik (item) alımı için video izletenler olunca bu reklam kanalını da denemek istedim. Yine Vungle SDK 'sını indirerek işe başladım. Ufak bir kod geliştirmesiyle birlikte diğer uygulamalarda yaptığım gibi çıkış ekranına reklamı koydum. Sadece tek bir soru farkıyla! Uygulamadan çıkmak isteyen kişi acaba reklam izler miydi? Ben uygulamayı kullanan kişileri bu tarz reklamlara boğma onları sıkma eğiliminden kaçınmak istiyordum ve aklıma bu geldi. Vungle performansına gelecek olursam;
Vungle dashboard

  1. Video reklamları çok hoş duruyor ve ilgi çekiyor. Özellikle oyunlar tercih etmeli
  2. Google (Admob) tarafında bu özelliğe rastlamadım
  3. Reklamın izlenip izlenmediği hakkında bilgi döndüğü için farklı amaçlarla kullanma imkanı doğuyor
  4. Web sitesi performanslı çalışmıyor (çok daha kötüydü biraz düzelttiler)
  5. Her ne kadar gösterim miktarım az olsa da gelirler öyle çok fazla değil
  6. 100$ geçtiğiniz aydan NET60 (60 gün sonra) ödeme alabiliyorsunuz. (Kısaca benim gibi 3 ay beklediniz 4.ayın başında 100$ oldu ama ay sonundan 60 gün sonrasını bekleyeceksiniz)
  7. Paypal üzerinden 6 ay sonra olsa da ödeme aldım.
Kısaca toparlamak gerekirse, önceki yazılarımda da belirttiğim gibi Abmob' a alternatif birçok seçeneğiniz var. Bunlardan denediğim ikisi için uzun zaman zarfında olsa da ödeme aldım. Admob' a gıcığınız yoksa, farklı reklam kanalları denemek istiyorsanız, (bende olmadı ama) gerçekten daha fazla vereni bulma şansınıza inanıyorsanız farklı kanalları tercih edebilirsiniz. Onun dışında henüz kullanmasam da Admob altındaki "Mediation" başlığını incelemenizi tavsiye ederim.

Bu kısımda Vungle' ı ayrı bir yere koymak isterim. Henüz Google alternatifi olmadığından özellikle uygulama içi özellik açmakta reklam izleme zorunluluğu koyarak farklı gelir modeli oluşturabilirsiniz.

Her ne kadar tam sayfa ve video reklamı zorunlu koymasam da aşağıdaki gibi farklı! yorumlara maruz kalabilirsiniz.

Bir sonraki yazıda görüşmek üzere...






Androidde JSON veriyle çalışmak

Üşengeçlik nedeniyle uzun süredir bakmadığım android projelerine bir önceki yazımla birlikte geri dönmemle birlikte ufak tefek işleri de aradan çıkartmak istedim. Bu yazımda sizlere web servis üzerinden gelen JSON verilerle nasıl çalışabilirizi göstermeye çalışacağım.

JSON (Javascript Object Notation) XML veri yapısına alternatif teşkil eden, gözle rahatlıkla okunabilen bir veri yapısı formatıdır. Hal böyle olunca veri transferinde kullanılması aşikardır. Özellikle .Net tabanlı uygulamalarda ağırlıklı olarak XML veri yapısının kullanılması ve ön plana çıkartılması nedeniyle duyulması biraz zaman almıştır.

Veri yapısına bağlı olarak %30 lara varan oranda XML veri yapısından daha az yer kaplamasından ve diğer programlama dilleriyle (Java, Javascript) uyumluğunu göze alarak ben de servislerimde dönüş formatı olarak JSON veri kullanmayı tercih ettim. Böylece ileriki zamanlarda olur da .Net web servislerinden vazgeçersem client tarafında yapılacak iş daha az olacağını ümit ediyorum.

Web Servis metodlarından çıkan DTO (Data Transfer Object) nesnelerini JSON formatında formatladıktan sonra (belki bir sonraki .net yazımız olur) oluşan JSON string 'imizi android uygulamamıza gönderiyoruz. Belki daha önceki yazılarımda bahsetmişimdir, android tarafında .net web servislerini kullanmak için KSOAP2 isimli kütüphaneyi kullanıyorum ve servis sorgulaması sonucu üretilen json stringini android client uygulamasına geçiriyorum. Dilerseniz öncelikle .net tarafında iletmek istediğim veriye ait sınıf yapısını inceleyelim.

Resimde görüldüğü gibi CategoryResponseDTO sınıfı client uygulama tarafına iletmek istediğim asıl nesnedir. Aynı şekilde içerisinde bana ait sınıfları içerebilir ve bu sınıflar birbirlerini miras alabilirler. Böyle karışık (aslında çok da karışık değil) nesneyi JSON formatına çevirdiğimizde aşağıdaki string oluşur.

{"Categories":[{"Image":"/Uploads/533a8bf0-2ca5-4ea1-a860-97ec4b4c6317.jpg","CaptionTR":"Çorbalarx","CaptionEN":"Soups","CaptionFR":"Fr Çorbalar","CaptionGE":"GR çorbalar","CaptionRU":"RUS çorbalar","CaptionAR":"AR çorbalar","ID":1},{"Image":null,"CaptionTR":"Yemekler","CaptionEN":null,"CaptionFR":null,"CaptionGE":null,"CaptionRU":null,"CaptionAR":null,"ID":2},{"Image":"/Uploads/noimage.png","CaptionTR":"Salatalar","CaptionEN":"Salads","CaptionFR":null,"CaptionGE":null,"CaptionRU":null,"CaptionAR":null,"ID":7},{"Image":"/Uploads/4990c79d-5103-4b72-9782-599c4c1a42a8.jpg","CaptionTR":"Doğumgünü Pastaları","CaptionEN":"Birthday Cakes","CaptionFR":"Birthday CakesFR","CaptionGE":"Birthday CakesGR","CaptionRU":"Birthday CakesRU","CaptionAR":"Birthday CakesAR","ID":8}],"ResponseCode":"0000","ResponseStatus":1,"ResponseMessage":null}

JSON formatına baktığımızda aslında verinin ne olduğunu anl
ayabiliyoruz. Yukarıdaki JSON string client uygulamasına geçtikten sonra dilediğiniz gibi parçalayabilirsiniz. Ama JSON verinin client tarafında oluşturulmasını istiyorsanız tıpkı sunucu tarafında olduğu gibi client tarafında da sınıfları tanımlamak gerekecek.

Görüldüğü gibi java kodunda da CategoryResponseDTO sınıfını ve bunun ana sınıfı olan ResponseBaseDTO sınıfını oluşturduk. .Net tarafındaki List<CategoryDTO> yapısını java tarafında ArrayList<CategoryDTO> olarak oluşturmak için aşağıdaki sınıf tanımlamalarını gerçekleştiriyoruz.


Dikkat ederseniz JSON verinin parçalanma işlemini ana sınıflarda (BaseDTO ve ResponseBaseDTO) sınıflarda başlatıp bunları miras alan sınıflarda sadece sınıfa ait üye için işlem yaptırıyorum. Bu sayede kontrollü bir şekilde JSON veriden sunucu tarafındaki veri sınıflarımızı client tarafa taşımış oluyoruz.

JSON veriyi parçalama işleminde JSONObject sınıfını kullanıyoruz. Dizi-liste işlemleri için JSONObject.getJSONArray() fonksiyonuna listeminizin ismini (Burada Categories) veriyoruz. Alınan bu JSON dizi verisi sonrasında diğer sınıflar içerisinde parçalanıp (parse) değişkenlere yerleştiriliyor.

Bu şekilde client uygulamasına gönderdiğiniz veriler, string işlemleri sonucunda ürettiğiniz verilerden daha güvenilir oluyor. Ayrıca işlemler miras mantığında ilerlediğinden belirli bir düzene oturmuş oluyor. Umarım bu yazımda ihtiyacınız olan sorulara yanıt bulmuşsunuzdur. Aklınıza takılanları buradan sorabilirsiniz.

Android para kazanmak veya kazanamamak

"Olmak ya da olmamak işte bütün mesele bu "
William Shakespeare

Biraz yukarıdaki özdeyiş gibi oldu başlık. Bu sefer konumuz Android marketteki icraatlar olacak. Bir önceki yazımda Android uygulama geliştirirken nasıl para kazanabileceğimizden bahsetmiştim ve son paragrafta sadece para kazanmak için içi boş uygulama yapmak istemediğimi yazmıştım. Bu yazım market/ uygulama/ kazanç performansları hakkında olacaktır.

Mobil uygulamalardan para kazanmak için belirlenen henüz temel üç yol olduğundan bahsetmiştik. Aslında 4.seçenek AppStore'da yerini aldı fakat tüm marketlere gelmediğinden temel olarak kabul etmiyorum.
  1. Uygulama bedava para reklamlardan
  2. Uygulama bedava ekstra özellikler paralı
  3. Uygulama paralı
  4. Uygulamanın başka geliştiricilere transferi
Öncelikle henüz paralı veya uygulama içi satın alma içeren bir uygulama geliştirmiş değilim. İlerleyen zamanlarda inşallah nasip olur da sizinle buradan deneyimlerimi paylaşırım. Temel konumuz hala reklam ile para kazandıran uygulamalar olacak.

Uygulama geliştirirken sırf reklam koyup para kazanayım, indirme başına para kazanıyorsam sadece indirilmesini sağlayayım, uygulamanın kalitesi önemli değil iş görsün reklam gösterip para kazandırsın demek ve bunun gibi sadece paraya odaklanarak uygulama yapmak tamamiyle bize kalmış bir tercihtir. Hele Google Play şartlarında çocuk oyuncağı diyebiliriz. Google Play anlayışı gereği siz hiçbir denetime tabi olmadan uygulamanızı markete yüklersiniz. Uygulama için şikayet gelirse o zaman inceleme başlatılır ve uygunsuz durumlarda uygulamanız marketlerden kaldırılır. Uygunsuz durumlara sayılacak birçok sebep mevcuttur ve Google bunların hepsini tek tek denetler. Bir uygulamanız askıya alınırsa onu askıdan kurtarmanız imkansızdır diyebilirim.


Askıya alınan uygulamalardan kendimden iki örnek verebilirim. Birisi daha ne olduğunu anlamadan google tarafından kapatılan bir uygulamadır ki sadece açıklamasını yanlış yazmıştım, diğeri ise kullanıcı şikayeti ile başlayıp bir inatlaşmanın sonucu olarak askıya alınan uygulamadır. Google Play şartlarını sürekli çiğner veya daha büyük kabahatler işlerseniz bu sefer hesabınız da kapatılır.

Hemen hemen her Android uygulama marketlerinde durum bu şekilde iken IOS uygulama marketi olan AppStore için durum biraz farklıdır. Orada uygulamanız markette yer almadan denetime tabi tutulur ve şu garantiyi vereyim içi boş tekrar uygulamayı kabul ettirmeniz imkansız gibi bir olaydır. "Bu uygulamanın web sitesinden farkı nedir? Fonksiyonelliği yok." diyerek bile kabul etmeyebilirler.

Amacımız başlığımızda belirttiğimiz gibi para kazanmak. İyi de mobil uygulamalardan nasıl para kazanacağız? Uygulama gelirlerimizi nasıl arttıracağız? Uygulama sayısı ile gelirler doğru orantılı artar mı? Çok uygulama çok gelir demek doğru mudur? Henüz bu soruların tamamına yanıtım kesin olmasa da tecrübelere dayanarak sorulara cevap bulmaya çalışacağım.

İyi de mobil uygulamalardan nasıl para kazanacağız?

Arkadaşım bu sorunu bir önceki yazımda kendimce anlattım. Bu kısımda biraz daha derinlere iniyor olacağız. Hala merak ediyorsan seni bir önceki yazıma buradan alabilirim.

Uygulama gelirlerimizi nasıl arttıracağız?

Artık para kazanıyoruz. Kişiye göre kazanç kelimesi anlam olarak yerini buluyorsa (bazıları için 1-2 dolar kazanç iken, bazılarına 1000-2000 dolar kazanç olarak görünmez) en azından aylık ödeme alabiliyorsak yani 100 dolar ve üzeri kazanabiliyorsak ve devam etmek için kararlıysak bu soru bize göre diyebiliriz. 3 ayda 5 dolar kazanarak bu işe başlayan, bu işe kazanç gözüyle bakan biri olarak sizlerle tecrübelerimi paylaşacağım. 

Mobil uygulamalarda reklam kapısından gelir elde ediyorsak amaç tıklanma oranını artırmaktır. Yapabileceğimiz ilk ve en etkili icraat bu olacaktır. Elbette her tık aynı ücreti getirmeyecektir. Yeri gelecek değerli reklamlarda alacağınız bir tık değeri düşük reklamlardan alacağınız 10-20 tıka eşdeğer olacaktır. Reklam çeşidini biz belirleyemediğimiz için (seçtiğimiz uygulama konusuna ve filtrelere göre kısmen belirlemiş olsak da bu güç reklam veren firmanın elindedir)  yapabileceğimiz tek şey tıklama sayısını artırmaya yönelik işlemler ve reklam pazarı bizim ülkemizden daha değerli pazarlar için uygulama geliştirmek olacaktır. Örneğin Amerika'da reklam verenler dolar değeri üzerinden verdiği ve rekabet fazla olduğu için daha değerli reklamlar yayınlanır. Aynı şekilde para değeri Türk Lirasından düşük Ukrayna için yayınlanacak reklamların değeri de düşük olacaktır.

Tıklama sayısını artırmak için reklam yerleşimi tipi ve gösterim sayısını artırmamız gerekecektir. Yapacağımız uygulamada kullanıcının parmaklarının daha çok ziyaret edeceği bölgelere reklam yerleşimi elbette daha akıllıca olacaktır. Bir listenin sonuna reklam yerleşimini koymak Android telefonların tuş takımını düşündüğümüzde mantıklı bir yerleşim yeri olacaktır.

Reklam yerleşimi ile birlikte gösterim sayısı da çok önemlidir. Günde 100 reklam gösteriminde alacağınız tıklama oranı ile 10.000 reklam gösteriminde alacağınız tıklama oranı doğru orantı olmasa bile ne kadar fark eder siz hesaplayın. Aşağıdaki resimde günlük reklam gösterim sayısıyla birlikte tıklamaların artışını rahatlıkla görebiliyoruz.



Reklam gösterim sayısını artırmak için uygulamamızı ya 
çok kullandıracağız ya da birden fazla uygulama ile kullanıcılara hitap etmeye çalışacağız. Uygulama içerisinde daha fazla ekran yaparak, uygulamamıza günlük değişim fonksiyonu katarak (borsa, döviz, haber gibi günlük değişen bilgiler), ya da oyun gibi sürekli açık tutması gerekecek uygulama yaparak kullanımını artırabiliriz. Kullanımı artan uygulamanın reklam gösterimi dolayısıyla reklama tıklatma şansı artar. Bazı uygulamalar gibi bir ekrandan diğer ekrana geçişte reklam çıkarıp tıklanmayı sağlamasını ve bunun gibi ali-cengiz oyunlarını tasvip etmiyorum. Bu tarz hileli durumlara verebilecek çok yaratıcı örnekleri ve bunların güzel paralar getirdiğini görsem de sizlere de önermiyor kendim de kullanmıyorum.

Yukarıda bahsedilen çeşitlemelerle uygulamanın kullanımını dolayısıyla reklam gösterimini artıramıyorsak artık uygulama sayısını artırmak zamanı gelmiştir. İşte bu kısımda sıra diğer sorumuza geliyor.

Uygulama sayısı ile gelirler doğru orantılı artar mı?

Konumuz mobil uygulamalar olunca, biz de üretici konumunda isek uygulama çeşitliliğini artırmak gelirlerimizi artırmak için bir yöntem olabilir. Farklı uygulamalar yaparak reklam ağımızı genişletebilir daha çok kullanıcıya ulaşabilir ve reklam gösterme sayımızı artırabiliriz. Mantıken doğru olan bu seçim, pratik hayatta uygulamanın kullanılmasına bağlı olarak değişeceğini görebilirsiniz.

Örnekten yola çıkarak bir uygulama yaptığımızı 5-10 bin indirme aldığını ve günlük 1-2 binlik reklam gösterimine ulaştığımız düşünelim. İndirme sayısının artmadığını güncellemelerin fayda vermediğini uygulamanın belirli bir reklam gösterim aralığına oturduğunu düşünelim. Böyle bir senaryo için farklı uygulamalarla yolumuzu açmak faydalı olacaktır. Ama kesinlikle bir sonraki uygulamanın da aynı olacağını düşünmeyin.

Kendimden örnek vermek gerekirse ilk 3 ayda 5 dolar para kazandığımı söylemiştim. Bu parayı 2 uygulama ki - bu uygulamalar günlük açılıp bakılması gereken uygulamalardı, üzerinden kazandım. Daha sonra yaptığım 2 uygulama ile sonraki ay 100 dolar kazandım ki  bu uygulamalardan birisi günlük diğeri ise istenilen zamanda kullanabilecek veri içeren uygulama idi. Gördüğünüz gibi uygulama sayısı ile bir artış yakalamış oldum. Hatta aynı uygulamanın diğer ülkeler için farklı versiyonlarını yaparak uygulama sayısını da artırabilirsiniz. Eskiden kabul gören bu teknik artık tek uygulamaya birden fazla dil desteğiyle terk edilmeye başlanmıştır diyebilirim.

İşin güzel tarafı daha önceden gelir getirmeyen ilk iki uygulama sonraki uygulamaların desteğiyle daha güzel indirme sayılarına ulaşmış oldu. Marketlerin güzel bir tarafı da üreticinin diğer uygulamalarından seçmeleri de kullanıcıya göstermesidir. Bu nedenle fazla uygulama yapmanın sadece gelir anlamında değil de popülerlik anlamında katkısı olacağını söyleyebilirim. Yoksa bir uygulama ile milyonlarca dolar kazanan şirketler de var.

Uygulamanın popülerliği, kullanım süresi elinizde değil. Bazı yollarla indirme sayısını artırabilir güzel yorumlar yazdırabilirsiniz. Sonuç olarak bu tarz işlerle belli müddet ilgilenebilecek sonrasında gelecek doğal davranışlarla uygulamanız markette belli bir yerde konumlanacaktır. Bu biraz da şans işi diyebilirim.

Mobil uygulama sayısının ve çeşitliliğinin (kategori çeşitliliği diyebiliriz) kullanıcı sayısını artırdığını gördük. Kullanıcı sayısıyla beraber kullanım oranı dolayısıyla reklam gösterim oranı da arttı. Sıra sayılardaki artışla birlikte gelirlerdeki artışı incelemeye geldi.

Çok uygulama çok gelir demek doğru mudur?

Bir kere konu insan ve tercihleri olunca çeşitliliğin inanılmaz arttığını görebiliyoruz. Çeşitlilik konusunu ev, araba, bilgisayar gibi aklınıza gelebilecek hemen her konuda düşünürseniz ne kadar farklı seçenekler olduğunu görebilirsiniz. 3+1 ev için ne kadar çok çeşit olabileceği, C sınıfı 4 silindirli hatta 1.6 benzinli bir otomobili kaç farklı markada ve şekilde bulabileceğinizi ve insanların bunları nasıl tercih ettiğini düşünün. Dikkat ederseniz temelde ihtiyaçlar belli olsa da, ürünler bu ihtiyaçlara cevap verse de her ürünün bir alıcısı oluyor. Kimi ürünler fazla satıyor kimileri ise istenilen rakama ulaşamıyor. Kimi ürünler de aynı işlevi görmesine rağmen daha kaliteli, daha çekici olabiliyor. Belki A firmasının 100 ürün satışından elde ettiği geliri aynı işlevsel ürünü B firması 1000 satış yaparak elde ediyor. Bu noktada kalite, tasarım, marka, hizmet gibi ince detaylar işin içine giriyor.

Mobil dünyada da bu durum böyle. Bir araştırmaya göre marketlerde bulunan uygulamalardan %60'ı indirme almamış. Bugünlerde bir milyar uygulamadan bahsedilen bir market için %60 çok ciddi bir rakam. Bu rakamın sadece market için değil aynı zamanda üreticiler için de düşündürücü olması gerekir. Nasıl bir üretim ve çeşitlilik ki 1 milyar civarında uygulama var ve bunlardan 600 bin civarında uygulama tercih edilmiyor. Tercih edilmeyen bu uygulamalar yeri geliyor bir market temizliğine kurban da gidebiliyor. Elbette hepimiz uygulamamızın tercih edilen hatta en üst sıralarda yer alan uygulama olmasını dileriz.


Sadece sayıları (indirme, gösterim) artırmak amaçlı hazırladığımız uygulamalar kimi zaman istediğimiz gelir performansını elde edemiyor. Kendimden olarak örnek verecek olursam, son zamanlarda sadece sayı artırmak için hazırladığım basit bir kaç uygulamanın gelir performansını sizlerle paylaşabilirim.

Gördüğünüz gibi pazar araştırması yapmadan (bu uygulamaların muadilleri fazlasıyla var), gerekli özeni göstermeden (muadil varsa daha farklı, kapsamlı yenilikler içerebilir) hazırlayacağınız uygulamalar gelir anlamında beklediğinizi size veremeyebilir. Hatta o kadar kötü ki son uygulamadan 3 gündür haber bile alınamıyor (3 gündür uygulama kullanılmıyor). Kısacası çok uygulama çok gelir demek değildir. 

Sonuç olarak mobil uygulamalardan reklam yoluyla para kazanmak için analiz çalışmaları yapmalı nereye reklam yerleştirip, nasıl uygulamalar üretip, hangi kategoriler altında yer alacağımızı iyi seçmeliyiz. Kimse aklındaki uygulama yapılmış diye uygulama geliştirmeyi bırakmasın. Unutmayın ki Google piyasaya çıktığında yahoo, altavista gibi onun üzerinde arama motoru vardı.

Uygulama dünyasından herkese bir arazi düşürmesi, bu arazinin ilerde değerlenmesi dileğiyle...






Nesneye Dayalı Programlama (OOP) S.O.L.I.D ilkeleri

Bu aralar işlerden fırsat bulup araştırmalar yapıyorum. Belli bir konu üzerinde araştırma yaparken özellikle araştırmayı internet üzerinden yapıyorsanız dallandıkça dallanıyorsunuz. Konu ile ilgili bir makale okurken, makale içinde geçen bir bağlantıya tıklayarak veya makale içinde geçen bir kısalmanın anlamını arayarak ana konudan diğer konulara geçiş yapıyorsunuz.

Son zamanlarda tasarım kalıpları (desing patterns) üzerinde çalışmaktayım. Benim gibi sürekli pratik ile ilerleyen birisi için, kitab-i bilgilere girmek devrim sayılabilir. Tasarım kalıpları kısaca herhangi bir programlama dilinden bağımsız, bir uygulama tasarımında hangi yolların izlenebileceğini, yaparken nelere dikkat edilmesi gerekebileceğinden bahseden konular bütünüdür. (Çok ilginç bir tanım oldu inşallah doğrudur) Özellikle belli başlı tasarım kalıplarını incelerken S.O.L.I.D ilkeler adlı bir konuya daha doğrusu kısaltmaya denk geldim ve dallanarak SOLID 'in ne olduğunu araştırdım.

"SOLID Principles" (katı ilkeler) olarak geçen bu konu aldığı isim ve anlattığı konunun uyuşmasıyla muhteşem olmuş diyebilirim. Nedir bu S.O.L.I.D ilkeler? Nerede kullanılır? Nasıl yapılır?

Aslında kurumsal uygulama geliştiren, uygulama geliştirirken biraz nesneye dayalı programlama tekniklerini kullanmaya çalışan her yazılım geliştiricinin haberi olarak ve/veya olmadan uyguladığı bazı tekniklerdir. SOLID ilkeleri aşağıdaki gibi açıklayabiliriz.
  • Single Responsibility Principle (Tek sorumluluk)
  • Open / Close Principle (Açık / Kapalı olma durumu)
  • Liskov Substitution Principle
  • Interface Segregation Principle (Arayüz Ayırma)
  • Dependency Inversion Principle (Bağımlılıktan kurtarma)
Single Responsibility Principle (SRP) : Her sınıf tek bir amaca hizmet etmelidir. Genel kural olarak yazılan her bir sınıfın sadece yazıldığı amaca hizmet etmesi diğer sınıfların işlerine veya kendi işlemlerinin dışında bir işlemi gerçekleştirmemesi istenir. Basit bir örnekle dört işlem adında bir sınıf hazırlıyorsanız, içerisinde dört işlemi yapan fonksiyon, değişken tanımlamanız gerekir. Kök alma, faktöriyel, kombinasyon, permutasyon... gibi işlemler de dört işlemle yapılıyor diye aynı sınıfın içerisine yazmamanız gerekir. Sınıf adına uygun şekilde işini gerçekleştirmelidir. Aşağıdaki gibi bir örnek de verebiliriz.


Dikdortgen sınıfına ait AlanHesapla ve CevreHesapla sınıfın kendi işlevidir. CizimYap fonksiyonu ve fonksiyona ait değişkenler her ne kadar Dikdortgen sınıfına hizmet ediyor gibi görünse de aslında genel bir çizim fonksiyonu olabilir ve ikinci kısımda belirtildiği şekilde ayrı bir sınıfta değerlendirilmelidir.

Open / Close Principle (OCP): Yazılım içerisinde kullanılan varlıklar (sınıf, fonksiyon, modül gibi) değime kapalı, genişletmeye açık tutulmalıdır. Yani her fonksiyonel değişimde uygulamanın varlıkları değişime özel değişmemeli aksine ek özellik olarak genişletilebilmelidir. Konu nesneye dayalı geliştirme olunca miras özelliğinden faydalanarak absract, virtual, protected sınıflar, fonksiyonlar, değişkenlerin kullanımı yapılması gerekir. Örnek olarak aynı sınıfları kullanacak farklı projeler için, sınıflar her projeye özel değiştirilmemeli, aksine her projede miras alınarak yapabilecekleri genişletilmelidir.


Liskov Substitution Principle (LSP):
İngilizce açıklamalarında anlaşılması zor bir ilkedir. Genel olarak türetilen bir sınıfta, ana sınıfın fonksiyonlarını kullanırken beklenti ve sonuç ilişkisinin doğru kurulması istenir. Türetilecek sınıf için fonksiyonların nasıl sonuçlar çıkaracağını ve ne çıkarması gerektiğini önceden detaylı düşünülmesi gerektiğini belirtir. Popüler örnekle açıklayacak olursak;


Kare sınıfı aslında bir dikdörtgendir. Dolayısıyla kare sınıfı dikdörtgen sınıfından türetilebilir. Yukarıda yazılan kod doğru gibi görünse de test kodunda beklenen sonuç ile gerçek sonuç farklılık göstermektedir. Bu hata Kare sınıfının Dikdörtgen sınıfından en azından bu şekilde türetilemeyeceğini gösterir ve bu türemenin yapılabilmesi için daha fazla düşünmenin gerekliliği ortaya çıkar.

Interface Segregation Priciple (ISP): Nesneye dayalı programlamada kullanılması gereken arayüzlerin (Interface - grafik arayüz "GUI" değil) içerdiği metotlarda gereksiz yoğunluğun azaltılması istenir. Arayüzü kullanacak programcıların, kullanmayacakları metotlara zorlanması istenmez. Bu sebeple üretilen arayüzlerin küçük kapsamlı olması ve nokta atışlı fonksiyonlar içermesi istenir.

Örneğin DB adlı arayüz veritabanı işlemleri için oluşturulmuşsa, "SelectByName" ve "UpdateByName" fonksiyonları zorunlu olmamalıdır. Çünkü bu fonksiyonlar "Name" kolonu içeren fonksiyonlar için çalıştırılmalı, kolonu içermeyen tablolar için veya içermese de başka bir fonksiyonu gerçekleştirmek için kullanılmamalıdır. arayüz programcıyı sadece her sınıf için gerekecek fonksiyonların oluşturulmasına zorlamalıdır.

Dependency Inversion Principle (DIP): Aslında çıkış noktam bu konuydu. Dependency injection ve Inversion of control konularını incelerken karşıma SOLID yapısı çıktı. Bu ilke yüksek seviyedeki modüllerin, düşük seviyedeki modüllere bağımlı olmaması gerekliliğini belirtir. Bağımlılık sadece soyutlamalar (abstractions) üzerinden yapılmalıdır. Ayrıca bu bağımlılıklar detay içermemeli, aynı şekilde soyut kavramlara bağlanmalıdır. Tanım bu şekilde ama sanki biraz soyut kalıyor. Örneğe geçecek olursak;

Personel sınıfı için kaydetme fonksiyonu oluşturmak istediğimizde (Personel üst sınıf) kaydetme şeklinin uygulama içerisinde üç farklı seçenekle yapıldığını düşünelim. Çalışma anında kaydetme şekli belirlenecek ve personel o şekilde kaydedilecekse yazdığımız sınıftaki gibi bir çözüm üretebiliriz. Fakat bu sınıfta SOLID ilkelerinin birincisi olan sınıfa ait tek sorumluluk ilkesi çiğnenmiş oldu. Çünkü Personel sınıfı içerisine dosyaya, log'a ve veri tabanına yazma fonksiyonlarını getirdik. Ayrıca kaydetme fonksiyonu da gereksiz olarak büyüdü.

Sonuç olarak Personel sınıfı hem tek sorumluluğu içermedi hem de kaydetme fonksiyonlarına bağımlı bir yapıya büründü. İleride yeni bir kaydetme türü için Personel sınıfı içerisine yeni bir fonksiyon eklenmeli ve mevcut (Save) fonksiyonda değişiklik yapılmalıdır. Değişiklik yaparak ikinci ilke "Açık / Kapalı durumu" (OCP) çiğnenmiş olur.

Çözüm olarak farklı bir tasarıma gitmemiz gerekir. Personel sınıfı kaydetme fonksiyonunu içermeli, nasıl kaydedeceğini bilmemelidir. Ayrıca kaydetme seçenekleri yeni sınıflar sayesinde arttırılabilmeli ve bundan Personel (üst sınıf) haberi olmamalıdır.
Örnekte Personel sınıfının kaydet metodu bir arayüz (soyut) kullanarak kaydetme işlemini gerçekleştirir. Nasıl gerçekleştireceğinden haberi yoktur. İşlemi "Saving" adlı arayüz (interface) üzerinden gerçekleştirir. Bu sayede SOLID için birinci ilke (SRP) tamamlanmış olur. Üç farklı kaydetme işlemi için, üç farklı sınıf oluşturulmuştur. Bu sayede çalışma anında seçilecek tür ile kaydetme fonksiyonu gerçekleştirilir.

Artık Personel sınıfı tek sorumluluk taşıyan ve bağımlılıkları ortadan kalkmış bir sınıftır.