Mobili yakalamak / IsMobileDevice / 51 Degrees

Daha önce bahsettiğim mobil uygulama çilesini bilenler bilir (bilmeyenler için; Android Üzerine). Bu uygulama tabii ki her ne kadar küfretmek istesem de edemediğim bir sorunla karşı karşıya kaldı geçenlerde. Güvenli kontrol ve download istatistiği sağladığımız için belirli bir download sayfasından verilen izinli dosyaların, mobil cihazlarda indirilememesi. Ben de yeter artık diyerek, mobil gelen cihazlara direk dosyayı link olarak atamaya karar verdim ve bu sorunun daha üstesinden gelecektim ki – ayrıca bu karara 6 saatlik iş gücü sonrasında ulaştım – bir sorunla karşılaştım. .Net Bowser Request.Browser.IsMobileDevice özelliği, tabletleri yakalamıyor!!!

Sorun

Sorun belli, sisteme talepte bulunan bir cihazın mobil olup olmadığını anlamak için eklenen eklenti tabletleri yakalamıyor. Ayrıca bunun güncel olduğunu da pek sanmıyorum. Cihazın tabletde olsa neden mobil olarak algılanmasını istememin sebebi de, üzerinde o harika Android işletim sisteminin olması. Bu arada belirtmem gerekir ki; iOS aletlere hiç bir sorun yok, Android’in en güncel sürümlerinde de hiç bir sorun yok yani download yönlendirme sayfamızdan indirme yapabiliyorlar. Fakat Andorid’in eski sürümünü kullanan %35’lik bir kesim olunca ve bu arkadaşlar sürekli Play Store’a “dosyalar açılmıyor, ne kötü program” diye yazınca insan görmezden gelemiyor işte.

Çözüm 1

Baştan diyeyim bu sorunu çözmedi :D. (http://detectmobilebrowsers.com)’a girip oradan browser agent ile yakalarım ben ne olacak ki yaa dedim ben de. Demez olaydım, sonuçta Chrome tarayıcısı tablet ve desktop arayüzünde benzer agent info bilgisini kullandığı için bu ihtimal de bir çırpıda son buldu. Dedim ki media query koysam falan, gizlesem göstersem linkleri. O kadar da düşmedin sen dedim kendi kendime. Bunun üzerine araştırma yapınca bu tip dataların en güncel halinin (WURFL)[http://wurfl.sourceforge.net] denen açık kaynaklı bir DB’den geldiğini öğrendim. Fakat bunu nasıl implemente edebilirdim ki, ayrıca tek istediğim sadece IsMobileDevice yazıp, if koyup link göstermek yani gerek var mı bu karada eziyete? (YAGNI) 1

Esas Çözüm

İşte tam bu düşüncelerin arasında bir çözüm buldum 51degrees (http://51degrees.codeplex.com). Başta open source yazılan ve daha sonra paralı versiyonu da çıkan bir library. Ayrıca sadece .net için değil diğer diller için de çözümleri bulunmakta. Kurulumunu da NuGet üzerinden yapabildiğimiz için direk atladım diyebilirim. Bu arada yükleyeceğim sistem de kıçıkırık bir sistem değil, anlık responce timeların istatistiğini tuttuğumuz büyük bir ERP çözümü. Yine de seçenekleri bitince insan her yolu denemeye başlıyor.

NuGet üzerinden yükledikten sonra kendi configurasyon ayarı ve dll dosyası ile sisteme dahil olan bu çözüm üzerinde bir ayar yapmadım. Açıkcası Login yönlendirmesi ve gereksiz iki üç dosya vardı, bunları kaldırmaya ayar denemez bile. Sonuçta sistemi çalıştırdığımda her şey istediğim gibiydi. Tablette test edince yine Mobile olarak algılıyor ve her şey mükemmel çalışıyordu. Size tavsiyem bu ürünü eğer sitenizin mobil kısmını yapacaksanız kullanmanız. Zira açık lisanslı hali ile gayet güzel kullanılabiliyor.

Sadece bu özelliğe yaramayan 51degrees’in diğer özelliklerini ele alırsak;

  • ScreenWidth ve ScreenHeight değerlerini alabilmek.
  • Request.Browser.IsMobileDevice özelliğini genişlettiği için ekstra bir kod yazmamak.
  • Paralı versiyonunda IsTablet gibi bir değişkene sahip olmak,
  • Free hali ile haftada bir güncelleme geçirdiği ve bu da standart mobil cihazlar için yeterli bir güncelleme olduğundan pek de bir sorun teşkil etmemek,
  • Paralı versiyonu ile tarayıcınızın bir çok özelliğine erişmek; renkler, falan filan,
  • Paralı versiyonunda gelen kullanıcının Celluar mı yoksa Wi-Fi üzerinden geldiğini bulmak.

Açıkcası bana free versiyonu yettiği için pek de diğer özelliklerini araştırmadım. Eğer gerçekten hızlı ve sürekli güncellenen – bu arada WURFL DB’sine bağlayabiliyor ve oradan güncellenmesi sağlanabiliyor – bir sistem istiyorsanız ve Request.Browser.IsMobileDevice kodu sizi deli ediyorsa, bu tam da sizin aradığınız çözüm.

Size kafayı sıyırmadan iyi mobil kodlamalar…


  1. You aren’t gonna need it! prensibi. 

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.