Offline First Nedir?
Uygulamanın öncelikle yerel veri ile çalışıp, bağlantı olduğunda sunucu ile senkronize olma yaklaşımı. Kullanıcı internet olmadan da uygulamayı kullanabilir. Bu mimari, mobil bağlantının güvenilmez olduğu ortamlarda üstün kullanıcı deneyimi sunar.
Neden Önemli?
- Mobil bağlantı her zaman güvenilir değil
- Metro, uçak, kırsal alan gibi bağlantısız ortamlar yaygın
- Daha hızlı uygulama deneyimi (yerel veri anlık yüklenir)
- Daha iyi kullanıcı memnuniyeti ve retention oranı
- Gelişmekte olan ülkelerde bağlantı kalitesi düşük olabiliyor
Temel Prensipler
1. Local First
- Veri önce yerel veritabanına yazılır
- UI her zaman yerel veriyi gösterir
- Senkronizasyon arka planda yapılır
2. Conflict Resolution
- Aynı veri hem yerel hem sunucuda değişirse ne olur?
- Last Write Wins (basit ama veri kaybı riski taşır)
- Merge stratejileri (alan bazlı birleştirme)
- Kullanıcıya sor (en güvenli, en rahatsız edici)
- CRDT (Conflict-free Replicated Data Types) ileri seviye çözüm
3. Queue System
- Offline yapılan aksiyonlar kuyruğa alınır
- Bağlantı geldiğinde sırayla sunucuya gönderilir
- Başarısız olanlar retry edilir
- İdempotent operasyonlar tercih edilmeli
Yerel Depolama Seçenekleri
React Native
- MMKV: Çok hızlı key-value (C++ tabanlı, en hızlı seçenek)
- SQLite (expo-sqlite): İlişkisel veri için ideal
- WatermelonDB: React Native için offline-first veritabanı
- Realm: Mobile-optimized veritabanı (MongoDB Atlas Sync)
iOS Native
- Core Data: Apple'ın ORM çözümü
- SwiftData: Modern Core Data alternatifi (iOS 17+)
- Realm: Cross-platform veritabanı
Android Native
- Room: Jetpack SQLite wrapper (önerilen)
- DataStore: Key-value saklama (SharedPreferences'ın yerini alıyor)
Senkronizasyon Stratejileri
Pull-based
- Uygulama periyodik olarak sunucudan çeker
- Basit ama gecikme var
- Timestamp bazlı delta sync ile optimize edilebilir
Push-based
- Sunucu değişiklikleri push eder (WebSocket, SSE)
- Gerçek zamanlı ama karmaşık implementasyon
- Bağlantı koptuğunda state yönetimi zor
Hybrid
- Push ile bildirim, pull ile veri çekme
- En yaygın ve dengeli yaklaşım
- Hem gerçek zamanlılık hem güvenilirlik sağlar
Offline UI Kalıpları
- Bağlantı durumu göstergesi (banner veya ikon)
- Gönderilmeyi bekleyen öğelerde "pending" işareti
- Offline kullanılamayan özellikleri devre dışı bırak (disabled state)
- Senkronizasyon durumu göstergesi (son senkronizasyon zamanı)
- Optimistic UI: Aksiyon hemen görünsün, arka planda gönder
Best Practices
- Kritik veriyi her zaman cache'le
- Optimistic UI kullan: Aksiyon hemen yansısın, sunucu onayı beklenmesin
- Bağlantı geldiğinde otomatik senkronize et
- Veri çakışmalarını zarif şekilde çöz
- Depolama limitlerini dikkate al (eski veriyi temizle)
- Ağ durumu değişikliklerini dinle (NetInfo API)
2026 İtibariyle Güncel Durum
- WatermelonDB ve Realm offline-first projeler için en popüler seçenekler
- CRDT tabanlı çözümler (Yjs, Automerge) mobilde yaygınlaşıyor
- SwiftData (iOS 17+) ile Apple native offline desteğini güçlendirdi
- expo-sqlite ile Expo projelerinde offline-first mimari kolaylaştı
Offline-first yaklaşım, "internet yokken de çalışsın" değil, "internet olsa da olmasa da mükemmel çalışsın" demektir.