Android Üzerine

Mobil, yazılımın geleceğidir!

Bu lafın doğruluğu tartışılamaz. Adamlar haklı, ne desek de haklı. Ben de bu haklılığa katılsam da, imkanlar izin vermediğinden pek yatırım yapamadım. Gel gör ki hiç umulmadık bir zamanda, bir insanın, şirketin ERP1 sistemine giriş yapan bir Android applikasyonunu piyasaya çıkartması ile ben de Mobil piyasına giriş yapmış bulundum. Tabii öncelikle o arkadaşa olan sinirimi bir kenara bırakmam da gerekmedi diyemem, burada dikkat etmemiz gereken nokta, şirket içinde kelle avını başlatmak yerine, bu arkadaşın açtığı karmaşayı bir nevi kâra çevirmek. Arkadaşımız iyiliklerle yazmış olsa da, şifreleri alıp kopyalamadığının garantisi maalesef yok, e biz de oturup bekleyemeyeceğimize göre kendi programımızı çıkartmalıydık.

Hikaye kısmı

Burası bildiğiniz hikaye kısmı. Gidilir Project Manager’dan onay alınır, IT Manager’dan onay alınır ve şirketin Android alanında uzman yazılımcısı bir gün kapatılarak proje hemen yazılmaya başlanır. Proje dediğime de bakmayın, bildiğin ERP sistemine link verecek olan, WebView aplikasyonu işte. Tasarımcıdan bir logo alınır, proje arkadaşın el hızlılığı ile 4 satırda halledilir ve Google Play Store‘a yüklenir2. Artık Google’ın onayı sonrasında duyuru yapmak kalmıştır. Burada dikkat edilmesi gerekilen nokta ise – esasen hepimizin kaçırdığı -; Hiç bir proje, bu kadar kolay yazılmaz!

Sorunlar

Play store’da çıkan programın üzerinde site açılır, kafalar rahattır ya da öyle sanılır. Sonrasında hemen geri dönüşler gelmeye başlar. Sen tabii git 2600 kişilik şirkete “Android’e yazılım yaptık eki eki” diye mesaj at, onlar da indirsin ve sorunlar başlasın. Sorunları ele alırsak;

  • Dosya download edemiyoruz,
  • Ekran çok küçük geliyor,
  • Raporlar sayfası açmıyor,
  • …ve bir takım eleştiriler…

Çözümler

İşte bugün tüm gün ilk noktaya kastık. Önce “Ya tabii WevView’de download yakalamamız gerek, ondan sanırım” dedik, değilmiş. Sonra “Başkalarında da olmalı bu sorun, bir de Google’a soralım” dedik, başımıza bela aldık. Sorunun iki yönlü ele alınması gerekiliyormuş;

  1. Android ayağı,
  2. ERP ayağı.

Çözümün Android Ayağı

Şimdi şöyle ki, siz böyle bir uygulama geliştirdiğinizde Android işletim sistemi için WebView kullanıyorsunuz, bu component de gidip sizin sitenizi açıyor fakat o kadarla bitse ne kadar güzel – iOS’da öyle3. Bu component bir nevi browser olduğu için bunu ayarlamanız ve buna uygun değişiklikler yapmanız gerekmekte. Bunlara örnek olarak javascript’in window.Open() methodu gibi kullandığınız noktaları açmanız4. Sonrasında isterseniz her açılan sayfanın uzantısına bakarak onu download edebilir, browser’a yollayabilir, DownloadManager’a göndermeye çalışabilirsiniz. Bu kısmi ayarlamaları yapmaya özen gösteriyoruz.

Çözümün ERP Ayağı

ERP her eşye hazırlıklı diyemeyiz tabii, o kısımda da yapılması gerekilen güncellemeler var. Bunlar tabii downloadManager.aspx dosyasında yapılmalı. Önce her gönderdiğimiz dosyanın header özelliklerini elden geçirmemiz gerek; Content-Type: application/octet-stream bunlardan biri. Sonrasında – hatta hiç ekstra eklemeden – Content-Disposition: attachment; filename="test.PDF" ekliyoruz. Bu ikinci kısımda “Content Disposition” kısmında dikkat etmemiz gereken noktalar ise; birincisi filename=”” olmalı yani filename’i çift tırnak içinde yazmalı, ikincisi ise uzantının büyük harflerle yazılması.

Çözümün Açıklaması

Android tarafında internetten bulduğunuz ilk kodu yapıştırdığınızda her şeyin güzel olacağını sanıyorsunuz ama öyle olmuyor, sırası ile gerçekleşen işlemler;

  1. WebView’dan proje açılır ve bir download linki tıklanır
  2. webView.setDownloadListener() kodu çalışır, bu kod ilgili sayfayı default browser’a gönderir
  3. Default browser POST yapar, aa bu bir file imiş ben bunu DownloadManager’a göndereyim der
  4. URL, Download Manager’a gelir. Bir kez de burada POST yapılır.
  5. Response Header dosyaları okunmaya çalışılır – okunamaz – ve dosya indirilir.

Kusura bakmayın ama böyle aşkın ben ızdırabını… Bu yöntemden kurtulmak için yaptığınız onca çalışma aslında daha da çok batmanıza sebep veriyor, Download Manager’a direk gönderim yapılabilir tabii bunu ben deneyemedim, vaktim yetmedi a dostlar. En kötü bir POST işlemi ile bitirirdik durumu.

Açıkcası bu kadar salak saçma bir mantıkla ilk defa karşılaşıyorum, kullanırken de sinirlendim ama sonuçta Android benim işletim sistemim değil. Bu işlemleri yapmamıza rağmen halen çalışmıyorsa – aslında çalışmıyorsa kodunuz yanlış, buradan eminiz, fakat kodunuz doğru ama yine de çalışmıyorsa – elimizde iki sonuç var demektir;

  • Download yapmaya çalıştığınız URL, korumalıdır.
  • Elinizdeki test aletinin Android sürümü uygun değildir.

Bizim durumumuzda her ikisi de kaynaklanmaktaydı. Şöyle ki siz bir dosya download ederken, o downloadManager.aspx dosyasına – artık hangi dilse – Session bazlı bir uygulama yaparsanız ya da HttpContext bazlı bir güvenlik yaparsanız, URL sürekli oradan buraya taşınacağı için bu değerleri yitirmekte ve sizi engellemektedir. Çok pis bir durum değil mi? Kendi güvenlik kodunuz tarafından alıkonmak!

Çözüm için, Android App içine gömeceğiniz bir URL validator kodu ile, sizin ERP projenizde bu validator string’i kontrol etmeniz. Eğer doğru ise kim olduğuna bakmadan download ettirmeniz. Ha bu teorik olarak bir güvenlik açığı yaratmaz mı? Bence babalar gibi yaratır ama elimizde maalesef çözüm olarak bu bulunmaktadır.

Ayrıca dikkat edelim test yaparken, ne kadar etrafınızda Android telefon varsa test edin, birinde çalışan kod diğerinde çalışmamakta ve bu sinir katsayılarını zıplatmaktadır. Siz çalışıyorsa bozmayın, direk yayına alın. Gerisini kullanıcılar düşünsün.

Bu konu ile ilgili devam eden yazılar tabii ki olacak, o zamana dek görüşmek üzere…


  1. Enterprise Resource Planning [Wikipedia] (http://tr.wikipedia.org/wiki/Kurumsal_kaynak_planlaması “Kurumsal Kaynak Planlaması”) 
  2. Sizden 25$ gibi bir ücret alıyor ama şirket adına gösterebiliyorsunuz. 
  3. Bu kısımla ilgili detaylı bir post hazırlanacaktır. 
  4. Bu “Sorunlar” kısmının üç numaralı sorununun çözüm noktasıdır, gözlerden kaçmasın.