Mobil Uygulamalarda “Offline Mode” Özelliği Geliştirmek

Ceren
7 min readSep 28, 2020

--

Merhaba

Bu yazıda sizlere mobil uygulama tarafında geliştiriciliğini yaptığım çevrimdışı mod sürecini, mimarisini ve geliştirme süreçlerimizde yaşadıklarımızı anlatmaya çalışacağım.

Teknik Detaylar:

Web Uygulama: .Net Core

Mobil Uygulama: Android — Java

Harita: Mapbox — OpenStreetMap

Web Servisler: SOAP, Rest (Servis Testleri Swagger, Postman)

Veritabanları: SQL Server, SQLite

Hafıza Yöneticisi: Preference Manager

İhtiyaç Analizi ve Önceliklendirme

Mevcut uygulama bir saha operasyonu yönetimi yapmaktadır. Tüm uygulama ve süreçlerini aynı anda offline mode durumunda çalıştıracak kadar geliştirme süremiz yoktu. O nedenle bizde bu konuyla ilgili ihtiyaçlarımızı öncelik sırasına dizerek, süreçleri incelemeye başladık.

6 sürecimizden en önemli tür, sahada var olan ama sunucuda kaydı olmayan gerçekleştirilmiş operasyonların tespit edilmesi ve sunucuya işlenmesiydi. İhtiyacımız mevcut durumumuza göre böylelikle net bir şekilde ortaya çıktı.

Sürecin tüm mobil uygulama ekranlarını önümüze aldık. İçerisinde geliştirilmesi gereken işler şu şekildeydi:

  • Yeni bir operasyon oluşturulacak. -> Pref Manager
  • Kullanıcıdan haritada konum seçmesi istenecek. -> Mapbox Offline Harita
  • Kullanıcıdan fotoğraf çekmesi istenecek. -> File Manager İşlemleri
  • Kullanıcıdan bilgi girişi yapması istenecek. ->SQLite Veri İşlemleri
  • Kullanıcıdan bazı veri türleri seçmesi istenecek. -> SQLite Veri İşlemleri
  • Operasyon tamamlama işlemleri yaptırılacak. -> SQLite Veri İşlemleri & File Manager İşlemleri

Peki bu sürecin offline modda çalışması için nasıl bir uygulama süreci gerekliydi?

Süreç Tasarımı

Adım adım düşünelim. Bir uygulamanız var. Bu uygulamanın bir çok dinamiği var. İçerisinde SOAP, Rest servislerden tutun, fotoğraf çekme, konumsal doğrulama, hesaplamalar vs. yaptığını düşünün. Bir de üzerine iş akışları gelsin…

Uygulamamızda hangi süreci offline mode da kullanacağımızı belirledik. Bu süreçleri geliştirirken kullanacağımız araç gerecimizi de belirledik. Şimdi sıra bir de bütünü gözlemleyelim.

Biz uygulamamızın sürecini şöyle tasarladık. Makalenin belki de en önemli kısmı burasıdır….

  • Kullanıcı uygulamada oturum açtığında uygulamanın durumu kontrol edilecek.
  • Uygulama durumu online ise Offline Moda Geç, Offline ise Online Moda Geç butonu menü içerisinde görüntülenecek.

Offline Moda Geç

  • Web servise “ben offline moda geçebilir miyim?” isteği atılacak.
  • Web servis dönüşü başarılı ise kullanıcıya haritadan bir alan belirlemesi istenecek.
  • Kullanıcı alanı belirledikten sonra İndir düğmesine tıklayarak uygulama sürecinde ihtiyacı olacak olan tüm verileri indirecek. Bu indirme işlemi SQLite içerisine yapılacak.

Online Moda Geç

  • Kullanıcı Online Moda Geç butonuna tıklar. Butona tıklandıktan sonra tüm veriler SQLite içerisinden okunarak bir JSON paketi haline getirilerek telefon içerisinde dosya olarak oluşturulur.
  • Dosya Upload servisine gönderilir.
  • Upload servisi ben bu dosyayı aldım dediğinde ardından bir HASH servisi çalıştırılarak dosyanın gittiğinden emin olunur.
  • Tüm json paketi ve görsel dosyalar için bu işlemler yapılır.
  • Gönderilen JSON paketi veritabanına işlenmesi için tetiklenir. İşlem süreci sonucuna göre web servise “Ben online moda geçebilir miyim?” isteği gönderilir.
  • Cevaba göre uygulamanın durumu online olarak ayarlanır.
  • İşlem sırasında herhangi bir veri işleme hatası oluşursa, sunucuda belirlenmiş olan yetkili kişilere birer uyarı maili gönderilir ve uygulamanın durumu online olarak ayarlanmaz.

Görevlendirme ve İş Paylaşımı

Süreç tasarımı ile birlikte bir çok görevimiz belli oldu. Uygulamanın bu hale gelmesi için hem web servis, hem de uygulama tarafında geliştirmeler yapılması gerekiyordu.

Web servis tarafında neler yapıldı onlara göz atalım.

  • Öncelikle izin (authentication) servisinin geliştirilmesi,
  • Online Moda Geçebilir miyim? / Offline Moda Geçebilir miyim? web servislerinin geliştirilmesi,
  • Dosya Upload işlemi web servisinin geliştirilmesi,
  • Dosya Hash işlemi web servisinin geliştirilmesi,
  • Process süreci web servisinin geliştirilmesi

Uygulama tarafında neler yapıldı onlara bakalım.

  • Uygulama modu belirlendi. Pref Manager kullanıldı. İlk yükleme Online kabul edildi.
  • Moda göre açılış süreci geliştirildi.
  • Online’a geç isteği geldiğinde yapılacak işlemler geliştirilecek. İndirilmesi gereken veriler nelerdir? Tespit edilerek web servis methodları hazırlanacak.
  • Offline’a geç isteği geldiğinde yapılacak işlemler geliştirilecek.
  • Operasyon süreç ekranları tasarlanacak.
  • Operasyon süreç ekranlarından toplanacak veriler için veritabanı oluşturulacak. Toplanan verinin yapısına göre bazı veriler SQLite içerisine kaydedilirken, bazıları pref manager içerisinde tutularak en son SQLite içerisine eklenecektir.
  • Oluşturulan veritabanı ile web servis process sürecinin ihtiyacı olan veriler birbirini karşılıyor mu? Kontrol edilecek.
  • Gönderilecek olan JSON içeriği üzerinde anlaşılacak.

Uygulama Yapısı

Uygulamanın bağlı olduğu bir beyin sunucusu var ve uygulamaların tüm ayarları kullanıcılarının bağlanacağı veritabanlarının ayarlarına göre oluşmaktaydı. Beyin sunucuya ulaşılamadığı takdirde kullanıcı oturum açamaz veya işlem yapamaz.

Uygulamamız içerisindeki saha süreçlerinde ileride bahsedeceğim detay sayfalar yer alıyor. Her bir süreç için farklı aktiviteler oluşturulmuş ve süreci takip edecek şekilde veri toplama işlemi yürütülüyor. Veri toplama sırasında beyin sunucudan gelen bazı kısıtlamalar hatalı içerik oluşturulmasının önüne geçerek depo işlemleri yönetimini kolaylaştırıyordu.

Sunucu Tasarımı
Sunucu — Uygulama Tasarımı

Bu şemada görüldüğü gibi kullanıcı kurum kodu ile birlikte kendisi için oluşturulan sisteme bağlantı isteği gönderiyor.

Uygulama öncelikle ana sunucuya giderek kurum koduna ait uygulama ayarlarını okuyor. Eğer bu kısımdan geçemezse oturum açma işlemi başarısız sayılıyor ve kullanıcıya mesaj gösteriliyor.

Eğer ana sunucu üzerinden okunması gereken tüm ayarlar okunduysa, kurum koduna ait sunucuya bağlantı sağlanarak kullanıcı parolasıyla oturum açması sağlanıyor.

Burada offline mode için kritik olan konu şu; ana sunucu içerisinden okunan uygulama ayar bilgileri verinin durumuna göre bir SQLite tablosuna ya da

Preference (pref olarak yazacağım) Manager içerisine alınır.

Bundan sonra uygulama içerisinde yapılan tüm işlemler kurum sunucusu üzerinden işletiliyor.

SQLite Veri İşlemleri ve Veri Kontrolleri

Uygulama içerisinde yer alan veritabanı yapısını şu şekilde oluşturduk.

Bir Operasyon tablosu düşünün. İçerisinde UID, Operasyon adı, açıklaması, türü vs. bilgiler olsun. Yeni bir operasyon oluşturulmak istendiğinde bir UID alanı oluşturulup PrefManager içerisine kaydediliyor. Operasyon tamamlanana kadar Operasyon tablosuna veri girişi yapılmıyor.

Bu Operasyon tablosuyla ilişkili OperasyonGorsel, OperasyonMalzeme, OperasyonVS. tabloları olduğunu düşünün. Bu tablolara giriş yapılırken ilk ekranda oluşturulan OperasyonUID bilgisi baz alınarak veri girişi yaptırılıyor.

Ekranlar içerisinden veriler toplandıkça ve onaylandıkça her bir veriyi sanki operasyon sonunda iptal edilebilirmiş gibi TASLAK durumunda SQLite içerisine kaydediyoruz.

Bu kaydettiğimiz veriler Operasyon tamamlama işleminde onaylandığında durumlarını TAMAMLANDI olarak atıyoruz ve Operasyon tablosuna da yeni bir operasyon ekliyoruz. Durumu TAMAMLANDI olan veriler veri gönderim işleminde sorgulanarak JSON içeriği oluşturuluyor.

Bu kısımda önemli olan işlem tablolara giren, silinmek istenen verilerin kontrolleri… Çünkü kullanıcı 3. ekrandan 2. ekrana geçmek istediğinde aslında ne yaptığını tam olarak anlayamıyoruz. 3. ekranda eklenen veri kabul edilecek mi? Silelim mi? Ne yapalım kullanıcı???

SQLite Tasarımı

Geliştirme sırasında bazı ters giden şeyler oldu ve verileri kaydettim demesine rağmen tekrar select yaptığımda verilerin gelmediğini gördüm.

Bu tür durumların oluşmaması için uygulama içerisine her bir onay süreci peşine eklenen veriye ait tablodan veri çekerek içerik kontrolü yaptırdım.

Görsellerin Oluşturulması ve Klasörleme

Her bir operasyona ait farklı türlerde görseller isteniyor. Bu görsellerin dosya adlarını, yollarını, türlerini vs. tabloda tutuyoruz.

Ben Offline moda geçilirken bir klasör oluşturdum. Bu klasör bu offline modun klasörü oldu. Daha sonra altında tarih atarak klasörler açtım. Bu klasörlerin içerisine de operasyonUID leri adında klasörler oluşturdum.

Tabi bu oluşumlar süreçle birlikte yapılıyor…

Dosya isimleri veritabanında yer alıyordu. Upload sırasında eğer fotoğrafı çekilmiş ama tamamlanmamış görevler varsa o göreve ait dosyaları sunucuya göndermeyerek işlem süremi ve gönderdiğim verinin içeriğini kaliteleştirmiş oldum.

Upload ve Hash İşlemleri

Malum olayımız offline mod…

İhtiyaç duyulduğuna göre internete pek güvenmemek gerek.

Burada kritik noktalardan biri upload işlemlerinin kontrol ediliyor olması; çünkü upload işlemi sırasında herhangi bir kopukluk ve servis geri dönüşünün olmaması bizim operasyonlarımızı kaybetmemize neden olabilir.

Emin olmadan işlem yapmamalıyız. Bu nedenle upload işlemi yapmadan önce gönderilecek olan dosyayı MD5 hash hesabı yapıyoruz.

Sonucu yine hafızaya alıyoruz.

Upload işlemi yapıldıktan sonra hemen peşinden gönderilen dosyaya ait HASH servisini çalıştırıyoruz. Sunucuya bu dosyanın hash hesabından çıkan değer nedir diye soruyoruz. Hash servisinden dönen sonuç ile hafızadaki uyuyorsa işlemler başarılıdır diyerek yolumuza devam ediyoruz.

Online Moda Geç / Offline Moda Geç İzinleri

Web taraflı uygulama işlemleri olan bir uygulama üzerinde geliştirme yapıyoruz. Bu nedenle sahada kimler online, kimler offline biliyor olmalıyız.

Özellikle depo işlemleri yer alan bu tarz uygulamalarda veriler her an patlayabilirdir. Bu kısımda o nedenle kullanıcılardan sunucudan izin almalarını istiyoruz. Aslında hem izin, hem haber vermek diyelim…

Kullanıcı offline moda geç servisi tetiklediğinde kullanıcının bilgileri vs. kontrol edilir. Bir problem yoksa öncelikle sahada kullanacağı depo, malzemeler ve bağlantılı diğer veriler kilitlenir. Böylelikle kullanıcı online moda geçene kadar mevcut durumu korunarak veri bozulması engellenir.

Process Süreci ve Hata Maili Gönderilmesi

Sunucu tarafında gönderilen dosyaların işlenmesi ile ilgili bir iş servisi çalıştırılıyor olacak. Fakat şu an için arz/talep dengesi incelendiğinde uygulama içerisinden bu servisi tetiklemek bizim ihtiyacımızı gideriyordu. O nedenle bizde uygulama mod değişikliği sırasında servisi tetikleme kararı aldık.

Servis tetiklendikten sonra eğer bir hata oluşursa uygulama ayarlarında tanımlanan kullanıcılara hata maili gönderiliyor. Mail içeriğinde dosya adı, ilgili operasyonUID içeriği ve alınan hataya dair detaylı bilgiler yer alıyor.

Bu süreçte uygulama sanki bir problem yokmuş gibi çevrimiçi moda geçiyor ve veri temizliklerini vs. yapıyor. Fakat eğer bir hata oluşmuşsa servis dönüşünde bu cevabı hafızaya aldığımız için uygulama içerisinden tekrar bir çevrimdışı moda geç isteği yaptırmıyoruz. Bir önceki gönderilen verilerin sorunu giderilene kadar o kullanıcı sahada pasif duruma geçmiş oluyor.

Dikkat Edilmesi Gereken Konular

Offline moda kullanımı 1 günü aşmayacak şekilde gerçekleştirilmelidir. Aksi halde JSON dosyası ve görsel içeriklerin boyutları büyüyecek ve gönderim süresini uzatacaktır.

Offline mod kullanımı sırasında cihazda herhangi bir bozukluk olur ve veritabanına ulaşılamazsa yürütülen kaydedilmiş olan operasyonların verisi kaybolacaktır.

Uygulama Geliştirme Sırasında Edindiğim Tecrübeler

Var olan bir yapı içerisine böyle bir yapı kurmak uygulama içerisinde baştan aşa bir etki analizi gerektiriyormuş.

SQLite içerisinde kaydettim dediği veriler her zaman kaydedilemeyebiliyormuş. Verileri riske atmamak adına bir veri kontrol yapısı geliştirdim.

Oluşturulan JSON üzerinde belki trilyon kere değişikliğe gittik. Bu da web tarafında yer alan process sürecinin aslında göründüğünden çok daha fazla içerik bekliyor olmasıydı. Bunun sebebi de mevcut veritabanın yapısıydı. Burada mevcut olan yapının geliştirmeleriyle birlikte kodlamalarda iyileştirmeler yaptık. Aslında bu kısımda öncelikle veritabanının bizden beklentileri üzerinden giderek uygulama tarafına geçseydik daha sağlıklı ilerleyebilirdik.

Görsel içeriklerin kaydedilmesi sürecinde oluşturulan klasör yapısı, upload işlemlerine göre oluşturulmalıymış. Bir kaç kez yapı değişikliği yapmam gerekti ve bu zaman kaybına sebep oldu.

Edindiğim değerli tecrübelerin yanı sıra aklımda kalanları sizinle paylaşmak istedim.

Faydası olduysa ne mutlu bana… 👩🏻

--

--

No responses yet