Proč je integrace API a databází v hybridních aplikacích odlišná
Hybridní mobilní vývoj (Flutter, React Native) kombinuje multiplatformní uživatelské rozhraní s nativními API. Zatímco vykreslování a interakce probíhají v rámci 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 přístup, konfliktní synchronizaci, latenci, omezení mobilních sítí, zabezpečení 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) nebo React Native (React komponenty) bez přímých síťových či databázových volání.
- Stav a doména: BLoC/Cubit, Riverpod, MobX (Flutter) nebo Redux/Zustand/Recoil (React Native). Doménové entity a use-case.
- Datová brána (Repository): sjednocené API pro UI; orchestruje komunikaci 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 mechanismy, řešení konfliktů, telemetry a strategie backoff.
Volba API: REST, GraphQL, gRPC a streaming
- REST: jednoduché cachování (ETag/If-None-Match), využití CDN, snadné testování. Nevýhodou je možné „over-fetching“ nebo „under-fetching“ dat.
- GraphQL: flexibilní dotazy, sjednocení více backendů, autorizace na úrovni jednotlivých polí. Vyžaduje kontrolu složitosti dotazů a perzistované operace.
- gRPC/gRPC-Web: binární protokol Protobuf, nízká latence, vhodné pro interní API a realtime streamy (obousměrný streaming).
- Realtime kanály: WebSocket, SSE, MQTT pro notifikace a synchronní aktualizace katalogů, chatů či stavů objednávek.
Databáze a úložiště v zařízení
- SQLite (relační): 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; React Native: Realm, MMKV (key-value, extrémně rychlé pro konfigurace).
- Šifrování: SQLite s SQLCipher, šifrované boxy v Hive, šifrované Realm; klíče bezpečně uloženy v Keychain/Keystore.
- Indexy a migrace: migrační skripty (Drift migrace, WatermelonDB migrace), verzování schématu a „forward-only“ strategie s testováním.
Offline-first: cache, fronty změn a konflikty
- Write-behind queue: lokální zápisy s časovou posloupností; synchronizační služba odesílá data při dostupné síti (exponenciální backoff s jitterem).
- Optimistické UI: okamžité vykreslení změny a následná korekce v případě chyby; UI musí reflektovat stav „synchronizace/selhání“.
- Konflikty: per-záznamové vector clocks, last-write-wins použitelné jen tam, kde to není nebezpečné; vhodnější je merge na úrovni polí.
- Selektivní replikace: synchronizace pouze relevantních dat (scoped sync) dle identity uživatele, geografické polohy 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šifrovaně do AsyncStorage/SharedPreferences.
- Transport: TLS 1.2+, certificate pinning (TrustKit/OkHttp Pinning, react-native-pinch), rotace klíčů.
- Úložiště: šifrovaná databáze, ochrana proti root/jailbreak prostředí (detekce a omezení funkcí), zkrácené retenční lhůty.
- Autorizace: per-endpoint scope; u GraphQL guardy na úrovni polí; u 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 modelem „stale-while-revalidate“.
- Normalizace: entity store (byId/byList); deduplikace a referenční integrita mezi obrazovkami.
Cachování a invalidace: strategie pro mobilní sítě
- HTTP cache: respektovat ETag/Last-Modified, Cache-Control; šetřit mobilní přenosy i 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óta); minimalizace plných re-synců.
Schéma a migrace: evoluce dat bez bolesti
- Verzování schématu: zvyšování schemaVersion, pre-migration zálohy, telemetry úspěšnosti migrací.
- Kompatibilita: protokol mezi API a klientem s feature flags, model „server říká klientovi“ (capabilities) a deprecation policy.
- Testy migrací: fixture databáze starých verzí, integrační testy v CI (Android/iOS simulátory) s časovým omezením.
Výkon a paměť: velké seznamy a náročné dotazy
- Stránkování: limit/offset nebo cursor na serveru; nekonečné seznamy s prefetch a placeholders.
- Selektivní projekce: u GraphQL vyžadovat pouze pole potřebná pro UI; u REST endpointy „/summary“ versus „/detail“.
- Serializace: generátory (json_serializable/freezed ve Flutteru, TypeScript typy a validace pomocí zod/yup v React Native) pro rychlé a bezpečné parsování.
- Batching: sloučení požadavků (Apollo Link, dataloader pattern), transakce v DB pro vícenásobné zápisy.
Chybové stavy, retry a backoff
- Kategorizace chyb: síťové (timeout, offline), validace (400), oprávnění (401/403), serverové (5xx), konflikty (409), limity (429).
- Retry politika: exponenciální backoff s jitterem pouze pro idempotentní operace; circuit breaker při opakovaných 5xx chybách.
- UX: stav UI pro „retry“, „offline“ a „konflikt“ s možností ručního sloučení.
Monitoring, logování a telemetrie
- Klientská telemetrie: metriky (latence sítě, velikosti payloadu), chybovost, úspěšnost synchronizací; sběr pomocí SDK (OpenTelemetry).
- Logování: strukturované, bez osobních identifikovatelných údajů (PII); korelace s backendem (trace ID); dynamické úrovně logů prostřednictvím remote config.
- Crash a ANR: integrace s Crashlytics/Sentry; symbol mapy (iOS dSYM, Android ProGuard/R8).
CI/CD a zajištění kvality
- Build pipeline: automatizovaná kontrola závislostí, generování kódu a typů, jednotkové a integrační testy, lint, podpisy aplikací.
- Testy: unit testy (serializace, repository), integrační testy (offline/online scénáře), end-to-end testy (Detox/Appium/Flutter integration tests).
- Feature flags: bezpečné zavádění migrací a nových endpointů, A/B testování bez narušení datové integrity.
Integrace nativních modulů a bridge vrstvy
- Flutter: platform channels pro volání nativních SDK (např. SQLCipher, biometrie); doporučuje se izolovat nativní volání v samostatné vrstvě a vystavit čisté Dart rozhraní.
- React Native: JSI/TurboModules minimalizují overhead mostu; pro databáze upřednostňujte knihovny s JSI implementací (např. 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šné cache politiky pro query a mutation.
- REST: idempotence u PUT/DELETE, conditional requests s ETag, oddělení read a write endpointů s jasným zpracováním chybových kódů.
Doménové modelování a mapování dat
- DTO vs. Entity: Data Transfer Object oddělit od doménových entit; mapování pomocí nástrojů (např. freezed + fromJson/toJson).
- Validace: validace podle schématu (zod/yup, json_schema) již na hranici RemoteDataSource.
- Event sourcing: pro auditovatelné domény ukládat lokální event log a derivovat čtecí modely (read models).
Práce s binárními daty a médii
- Upload: preferované pre-signed URL; chunked upload; omezení typů a kontrola malwaru na backendu.
- Download: cache řízená HTTP hlavičkami; pozornost k využití úložiště (automatická expirační politika).
Výkon na starších zařízeních a úspora baterie
- Batching synchronizace: seskupování změn do jedné transakce; plánování mimo aktivní interakce uživatele (BackgroundTasks/WorkManager).
- Prefetch s rozmyslem: pouze pro obrazovky s vysokou pravděpodobností zobrazení; zohlednění konektivity (Wi-Fi vs. mobilní data, režim úspory energie).
Provozní bezpečnost: řízení verzí API a „kill switch“
- Verzní brána (version gating): server odmítá klienty pod minimální podporovanou verzí s jasnou chybovou hláškou a odkazem na aktualizaci.
- Remote config: možnost ztlumit náročné funkce (např. realtime feed) v případě incidentu; přesměrování endpointů.
Checklist integrační datové vrstvy
- Vrstva repository odděluje UI od Remote a Local datových zdrojů.
- Offline-first: lokální cache, fronta změn, retry/backoff, řešení konfliktů.
- Bezpečnost: TLS + pinning, tokeny v Keychain/Keystore, šifrovaná databáze.
- Cachování: ETag/Last-Modified, klientská cache s invalidací po mutacích.
- Migrace: verzování schématu, automatizované testy migrací v CI.
- Telemetrie: latence, velikosti payloadu, úspěšnost synchronizací, trace ID.
- 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 pouze ve vyhrazené vrstvě.
Závěr: konzistentní data jako konkurenční výhoda
Hybridní aplikace mohou nabídnout nativní uživatelský zážitek a zároveň sdílený kód, pokud je datová vrstva navržena disciplinovaně. Kombinace robustní synchronizace, bezpečné lokální databáze, efektivního cachování a měřitelnosti vytváří předvídatelné chování i 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 poskytuje uživatelům spolehlivý, rychlý a odolný zážitek.


























