Proč je integrace API a databází v hybridních aplikacích jiná
Hybridní vývoj mobilních aplikací (Flutter, React Native) kombinuje multiplatformní UI s nativními rozhraními. Zatímco vykreslování a interakce probíhají v prostředí Dart/JS, data proudí přes síťová API a místní úložiště. Správně navržená datová vrstva musí řešit přístup 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í odpovědností
- Prezentace (UI): Flutter (Widgety, Material/Cupertino) nebo React Native (React komponenty) bez přímých volání sítě/DB.
- Stav a doména: BLoC/Cubit, Riverpod, MobX (Flutter) nebo Redux/Zustand/Recoil (RN). Doménové entity a případy užití.
- Datová brána (Repository): jednotné API pro UI; orchestrace mezi vzdáleným API a místním úložištěm.
- Datové zdroje: RemoteDataSource (REST/GraphQL/gRPC), LocalDataSource (SQLite/NoSQL/Key-Value).
- Synchronizační služba: plánování, opakované pokusy, logika řešení konfliktů, telemetrie a strategie exponenciálního odkladu.
Volba API: REST, GraphQL, gRPC a streamování
- REST: snadné cachování (ETag/If-None-Match), CDN, snadné testování. Nevýhodou může být nadměrné či nedostatečné načítání dat („over/under-fetching“).
- 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í Protobuf, nízká latence, vhodné pro interní API a streamy v reálném čase (obousměrné streamování).
- Kanály v reálném čase: WebSocket/SSE/MQTT pro oznámení a synchronní aktualizace katalogu, chatu či stavů objednávek.
Databáze a úložiště v zařízení
- SQLite (relační databáze): Flutter: sqflite, Drift (ORM + typová bezpečnost), Isar (nativní indexovaný engine). React Native: react-native-sqlite-storage, WatermelonDB (synchronizační model), TypeORM prostřednictvím nativních vazeb.
- NoSQL / dokumentové databáze: Flutter: Hive, Isar, Realm; RN: Realm, MMKV (úložiště klíč-hodnota, velmi rychlé pro konfigurace).
- Šifrování: SQLite se SQLCipher, šifrované boxy v Hive, šifrované databáze Realm; klíče v Keychain/Keystore.
- Indexy a migrace: migrační skripty (migrace Drift, migrace WatermelonDB), verze schématu a strategie „forward-only“ s testy.
Přístup offline-first: cache, fronty změn a konflikty
- Fronta se zápisem na pozadí (write-behind queue): místní zápisy s časem/pořadím; synchronizační služba je odešle, jakmile je síť dostupná (exponenciální odklad, jitter).
- Optimistické UI: okamžité vykreslení změny a následná oprava v případě chyby; UI musí znát stav „probíhá synchronizace / selhalo“.
- Konflikty: vektory hodin (vector clocks) pro jednotlivé záznamy, last-write-wins pouze tam, kde je to bezpečné; vhodnější je slučování na úrovni polí (merge on field).
- Selektivní replikace: pouze relevantní podmnožina dat (synchronizace v omezeném rozsahu) podle identity uživatele, geografie a oprávnění.
Bezpečnost a ochrana citlivých dat
- Tokeny a klíče: ukládat do Keychain/Keystore prostřednictvím flutter_secure_storage / react-native-keychain; nikdy je neukládat nezašifrované do AsyncStorage/SharedPreferences.
- Přenos: TLS 1.2+, certificate pinning (TrustKit/OkHttp Pinning, react-native-pinch), rotace klíčů.
- Úložiště: šifrovaná databáze, ochrana proti prostředí s rootem/jailbreakem (detekce a omezení funkcí), kratší doba uchovávání dat.
- Autorizace: rozsahy oprávnění pro jednotlivé endpointy; u GraphQL kontroly na úrovni polí; u REST kontrola na základě claims a ABAC v API gateway.
Správa stavu a datové streamy
- 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 její invalidaci; React Query/TanStack Query pro klientskou cache se strategií „stale-while-revalidate“.
- Normalizace: úložiště entit (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; u mobilních zařízení šetřit přenosy dat a baterii.
- Klientská cache: RTK Query / React Query (staleTime, cacheTime), Apollo Cache pro GraphQL; explicitní invalidace po mutacích.
- Synchronizace změn: server vrací změny od „kurzoru“ (timestamp/kvóty); minimalizace úplných opakovaných synchronizací.
Schéma a migrace: evoluce dat bez problémů
- Verzování schématu: zvýšení schemaVersion, zálohy před migrací, telemetrie úspěšnosti migrací.
- Kompatibilita: protokol mezi API a klientem s feature flags, přístup „server informuje klienta“ (schopnosti) a zásady ukončování podpory (deprecation policy).
- Testy migrací: testovací databáze starších verzí, integrační testy v CI (simulátory Android/iOS) s časovým limitem.
Výkon a paměť: rozsáhlé seznamy a náročné dotazy
- Stránkování: limit/offset na straně serveru nebo kurzor; nekonečné seznamy s předběžným načítáním (prefetch) a zástupnými prvky (placeholders).
- Selektivní projekce: u GraphQL vyžadovat pouze pole potřebná pro dané UI; u REST používat endpointy „/summary“ a „/detail“.
- Serializace: generátory (json_serializable/freezed ve Flutteru, typy TypeScript a validace zod/yup v RN) pro rychlé a bezpečné parsování.
- Dávkování: slučování požadavků (Apollo Link, vzor dataloader), transakce v databázi pro vícenásobné zápisy.
Chybové stavy, opakované pokusy a exponenciální odklad
- Kategorizace chyb: síť (timeout, offline), validace (400), oprávnění (401/403), server (5xx), konflikty (409), limity (429).
- Zásady opakovaných pokusů: exponenciální odklad s jitterem pouze u idempotentních operací; circuit breaker při přetrvávajících chybách 5xx.
- UX: stavy UI pro „opakovat“, „offline“ a „konflikt“ s možností ručního sloučení.
Monitoring, logování a telemetrie
- Telemetrie klienta: metriky (latence sítě, velikosti payloadů), chybovost, úspěšnost synchronizací; sběr prostřednictvím SDK (OpenTelemetry).
- Logy: strukturované, bez PII; korelace s backendem (trace id); úrovně logování dynamicky prostřednictvím remote config.
- Pády aplikace 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ódu/typů, unit a integrační testy, lint, podepisování.
- Testy: unit (serializace, repository), integrační (scénáře offline/online), end-to-end (Detox/Appium/integrační testy Flutteru).
- Feature flags: bezpečné postupné zavádění migrací a nových endpointů, A/B experimenty bez zásahů do integrity dat.
Integrace nativních modulů a vrstvy bridge
- Flutter: platform channels pro volání nativních SDK (např. SQLCipher, biometrie); doporučuje se izolovat nativní volání do jedné vrstvy a zpřístupnit čisté rozhraní Dart.
- React Native: JSI/TurboModules minimalizují režii mostu; u databází upřednostňujte knihovny s implementací JSI (WatermelonDB nad SQLite).
Bezpečné návrhové vzory pro GraphQL/REST v mobilním klientovi
- GraphQL: perzistované dotazy (hash), povinné operationName, kontrola velikosti proměnných a hloubky dotazů, oddělené zásady cachování pro query/mutation.
- REST: idempotence metod PUT/DELETE, conditional requests s ETag, oddělení endpointů pro čtení (read) a zápis (write) s jasnými chybovými kódy.
Doménové modelování a mapování dat
- DTO vs. Entity: objekty pro přenos dat (Data Transfer Object) oddělit od doménových entit; mapery (např. freezed + fromJson/toJson).
- Validace: validace založená na schématu (zod/yup, json_schema) již na hranici RemoteDataSource.
- Event sourcing: v doménách vyžadujících auditovatelnost ukládat místní event log a odvozovat z něj čtecí modely.
Práce s binárními daty a médii
- Nahrávání: přednostně používat pre-signed URL; nahrávání po částech; omezení typů, skenování malwaru na backendu.
- Stahování: cache řízená hlavičkami HTTP; pozor na nároky na úložiště (automatická politika expirace).
Výkon na starších zařízeních a úspora baterie
- Dávková synchronizace: seskupit změny do jedné transakce; plánovat mimo dobu aktivní interakce uživatele (BackgroundTasks/WorkManager).
- Promyšlené předběžné načítání: pouze u obrazovek s vysokou pravděpodobností otevření; zohledňovat připojení (Wi-Fi vs. mobilní data, režim úspory energie).
Provozní bezpečnost: řízení verzí API a „kill switch“
- Omezení podle verze: server odmítne klienty s verzí nižší než minimální a vrátí jasnou chybu/odkaz na aktualizaci.
- Remote config: možnost vypnout náročné funkce (feed v reálném čase) při incidentu; přesměrování endpointů.
Kontrolní seznam integrační datové vrstvy
- Vrstva Repository odděluje UI od vzdálených a místních zdrojů.
- Přístup offline-first: místní cache, fronta změn, opakované pokusy/exponenciální odklad, ř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: verze schématu, automatizované testy migrací v CI.
- Telemetrie: latence, velikosti payloadů, úspěšnost synchronizací, ID trasování.
- Výkon: stránkování, selektivní projekce, dávkování, izolované I/O.
- Chyby: kategorizace, stavy UX, opakované pokusy u idempotentních operací, 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í pocit a zároveň sdílený kód, pokud je datová vrstva navržena disciplinovaně. Kombinace robustní synchronizace, bezpečné místní 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, vrstvy Repository a datových zdrojů umožňuje rozšiřovat tým i produkt bez křehké architektury a přináší uživatelům důvěryhodný, rychlý a odolný zážitek.
