Proč je integrace API a databází v hybridních aplikacích jiná
Hybridní mobilní vývoj (Flutter, React Native) kombinuje křížově-platformní UI s nativními rozhraními. Zatímco rendering a interakce probíhají v rámcích Dart/JS, data proudí přes síťové API a lokální úložiště. Správně navržená datová vrstva musí řešit offline-first, konfliktní synchronizaci, latenci, omezení mobilní sítě, bezpečnost klíčů a integraci s nativními moduly (SQLite/Keychain/Keystore). Cílem je deterministický, testovatelný a energeticky efektivní přístup k datům s konzistentní doménovou logikou napříč platformami.
Architektura datové vrstvy: vrstvení a oddělení zodpovědností
- Prezentace (UI): Flutter (Widgety, Material/Cupertino) či React Native (React komponenty) bez přímých síťových/DB volání.
- Stav a doména: BLoC/Cubit, Riverpod, MobX (Flutter) nebo Redux/Zustand/Recoil (RN). Doménové entity a use-cases.
- Datová brána (Repository): jednotné API pro UI; orchestrace mezi vzdáleným API a lokálním úložištěm.
- Datové zdroje: RemoteDataSource (REST/GraphQL/gRPC), LocalDataSource (SQLite/NoSQL/Key-Value).
- Synchronizační služba: plánování, retry, konfliktní logika, telemetry a backoff strategie.
Volba API: REST, GraphQL, gRPC a streaming
- REST: jednoduché cachování (ETag/If-None-Match), CDNs, dobře se testuje. Nevýhodou může být „over/under-fetching“.
- GraphQL: flexibilní dotazy, sjednocení více backendů, per-field autorizace. Vyžaduje kontrolu složitosti dotazů a perzistované operace.
- gRPC/gRPC-Web: binární Protobuf, nízká latence, vhodné pro interní API a realtime streamy (Bidirectional streaming).
- Realtime kanály: WebSocket/SSE/MQTT pro notifikace a synchronní aktualizace katalogu, chatu či stavů objednávek.
Databáze a úložiště v zařízení
- SQLite (relace): Flutter: sqflite, Drift (ORM + typová bezpečnost), Isar (nativní indexovaný engine). React Native: react-native-sqlite-storage, WatermelonDB (synchronizační model), TypeORM přes nativní bindingy.
- NoSQL / dokumentové: Flutter: Hive, Isar, Realm; RN: Realm, MMKV (key-value, ultra rychlé pro konfigurace).
- Šifrování: SQLite s SQLCipher, šifrované boxy v Hive, šifrované realms; klíče v Keychain/Keystore.
- Indexy a migrace: migrační skripty (Drift migrations, WatermelonDB migrations), verze schématu a „forward-only“ strategie s testy.
Offline-first: cache, fronty změn a konflikty
- Write-behind queue: lokální zápisy s časem/pořadím; synchronizační služba odešle při dostupné síti (exponenciální backoff, jitter).
- Optimistické UI: okamžitý render změny a následná korekce při chybě; UI musí znát stav „syncing/failed“.
- Konflikty: per-záznamové vector clocks, last-write-wins jen tam, kde je to bezpečné; lepší je merge on field.
- Selektivní replikace: jen relevantní subset dat (scoped sync) dle identity uživatele, geografie a oprávnění.
Bezpečnost a ochrana citlivých dat
- Tokeny a klíče: ukládat do Keychain/Keystore přes flutter_secure_storage / react-native-keychain; nikdy ne do AsyncStorage/SharedPreferences nešifrovaně.
- Transport: TLS 1.2+, certificate pinning (TrustKit/OkHttp Pinning, react-native-pinch), rotace klíčů.
- Úložiště: šifrovaná DB, ochrana proti root/jailbreak prostředí (detekce a omezení funkcí), zkrácené retence.
- Autorizace: per-endpoint scopy; pro GraphQL field-level guardy; pro REST claim-based kontrola a ABAC v API gateway.
Správa stavu a datové streamingy
- Flutter: BLoC/Riverpod se Stream a StateNotifier pro odvozené stavy; izolace I/O v Isolates pro náročné operace (serializace, komprese).
- React Native: Redux Toolkit/RTK Query pro cache a invalidaci; React Query/TanStack Query pro klientskou cache s „stale-while-revalidate“.
- Normalizace: entity store (byId/byList); de-duplikace a referenční integrita mezi obrazovkami.
Cachování a invalidace: strategie pro mobilní sítě
- HTTP cache: respektovat ETag/Last-Modified, Cache-Control; pro mobilní šetřit přenosy a baterii.
- Klientská cache: RTK Query / React Query (staleTime, cacheTime), Apollo Cache pro GraphQL; explicitní invalidace po mutacích.
- Delta sync: server vrací změny od „cursoru“ (timestamp/kvóty); minimalizace plných re-synců.
Schéma a migrace: evoluce dat bez bolesti
- Verzování schématu: zvýšení schemaVersion, pre-migration zálohy, telemetry úspěšnosti migrací.
- Kompatibilita: protokol mezi API/klientem s feature flags, „server tells client“ (capabilities) a deprecation policy.
- Testy migrací: fixture DB starých verzí, integrační testy v CI (Android/iOS simulátory) s časovou limitací.
Výkon a paměť: velké seznamy a náročné dotazy
- Stránkování: server-side limit/offset nebo cursor; nekonečné listy s prefetch a placeholders.
- Selektivní projekce: u GraphQL vyžadovat jen pole potřebná pro dané UI; u REST endpointy „/summary“ vs. „/detail“.
- Serializace: generátory (json_serializable/freezed ve Flutteru, TypeScript typy a zod/yup validace v RN) pro rychlé a bezpečné parsování.
- Batching: sloučení požadavků (Apollo Link, dataloader vzor), transakce v DB pro vícenásobné zápisy.
Chybové stavy, retry a backoff
- Kategorizace chyb: síť (timeout, offline), validace (400), oprávnění (401/403), server (5xx), konflikty (409), limity (429).
- Retry politika: exponenciální backoff s jitterem pouze pro idempotentní operace; circuit breaker při přetrvávajících 5xx.
- UX: UI stavy pro „retry“, „offline“ a „konflikt“ s možností ručního sloučení.
Monitoring, logování a telemetrie
- Client telemetry: metriky (síťové latence, velikosti payloadů), chybovost, úspěšnost synců; sběr přes SDK (OpenTelemetry).
- Logy: strukturované, bez PII; korelace s backendem (trace id); log-levely dynamicky přes remote config.
- Crash a ANR: integrace s Crashlytics/Sentry; mapy symbolů (iOS dSYM, Android ProGuard/R8).
CI/CD a zajištění kvality
- Build pipeline: automatizovaná kontrola závislostí, generování kódů/typů, unit a integrační testy, lint, podepisování.
- Testy: unit (serializace, repository), integrační (offline/online scénáře), end-to-end (Detox/Appium/Flutter integration tests).
- Feature flags: bezpečné rozvolnění migrací a nových endpointů, A/B experimenty bez zásahů do datové integrity.
Integrace nativních modulů a bridge vrstvy
- Flutter: platform channels pro volání nativních SDK (např. SQLCipher, biometrie); doporučené je izolovat nativní volání v jedné vrstvě a vystavit čisté Dart rozhraní.
- React Native: JSI/TurboModules minimalizují overhead mostu; pro databáze preferujte knihovny s JSI implementací (WatermelonDB na SQLite).
Bezpečné návrhové vzory pro GraphQL/REST v mobilním klientu
- GraphQL: perzistované dotazy (hash), operationName povinná, kontrola velikosti proměnných a hloubky dotazů, odlišené query/mutation cache politiky.
- REST: idempotence u PUT/DELETE, conditional requests s ETag, oddělení read a write endpointů s jasnými kódy chyb.
Doménové modelování a mapování dat
- DTO vs. Entity: Data Transfer Object oddělit od doménových entit; mapery (např. freezed + fromJson/toJson).
- Validace: schema-first validace (zod/yup, json_schema) již na hranici RemoteDataSource.
- Event sourcing: pro auditovatelné domény ukládat lokální event log a derivovat read modely.
Práce s binárními daty a médii
- Upload: přednostně pre-signed URL; chunked upload; omezení typů, sken malwaru na backendu.
- Download: cache řízená HTTP hlavičkami; pozor na storage footprint (automatická expirační politika).
Výkon na starších zařízeních a úspora baterie
- Batching sync: seskupit změny do jedné transakce; plánovat mimo aktivní interakce uživatele (BackgroundTasks/WorkManager).
- Prefetch s rozmyslem: jen pro obrazovky s vysokou pravděpodobností otevření; respektovat konektivitu (Wi-Fi vs. mobilní data, režim šetření).
Provozní bezpečnost: řízení verzí API a „kill switch“
- Version gating: server odmítne klienty pod minimální verzí s jasnou chybou/odkazem na aktualizaci.
- Remote config: možnost ztlumit náročné funkce (realtime feed) při incidentu; přesměrování endpointů.
Checklist integrační datové vrstvy
- Repository vrstva odděluje UI od Remote/Local zdrojů.
- Offline-first: lokální cache, fronta změn, retry/backoff, řešení konfliktů.
- Bezpečnost: TLS + pinning, tokeny v Keychain/Keystore, šifrovaná DB.
- Cachování: ETag/Last-Modified, klientská cache s invalidací po mutacích.
- Migrace: verze schématu, automatizované testy migrací v CI.
- Telemetrie: latence, velikosti payloadů, úspěšnost synců, trace IDs.
- Výkon: stránkování, selektivní projekce, batching, izolované I/O.
- Chyby: kategorizace, UX stavy, idempotentní retry, circuit breaker.
- Bridge: nativní moduly přes Channels/JSI jen ve vyhrazené vrstvě.
Závěr: konzistentní data jako konkurenční výhoda
Hybridní aplikace mohou nabídnout nativní pocit a současně sdílený kód, pokud je datová vrstva navržena disciplinovaně. Spojení robustní synchronizace, bezpečné lokální databáze, rozumného cachování a měřitelnosti vytváří předvídatelné chování v proměnlivých podmínkách mobilních sítí. Důsledné oddělení domény, repository a zdrojů dat umožňuje škálovat tým i produkt bez křehké architektury, a přináší uživatelům důvěryhodný, rychlý a odolný zážitek.