EAS Update 2026: OTA aktualizácie v React Native po konci CodePush
CodePush skončil v marci 2025 a EAS Update je jeho oficiálny nástupca. Ukážeme si nastavenie kanálov, fingerprint runtime versioning, postupné rollouty od 5 %, tri spôsoby rollbacku a bundle diffing zavedený v Expo SDK 55.
EAS Update je hostovaná služba spoločnosti Expo, ktorá vám umožní posielať zmeny v JavaScripte a asset súboroch priamo do zariadení používateľov bez čakania na kontrolu v App Store alebo Play Store. Je to priama náhrada za CodePush, ktorý Microsoft vypol 31. marca 2025. Ak píšete React Native aplikáciu v roku 2026 a chcete opravovať chyby v produkcii v priebehu minút namiesto dní, EAS Update je dnes de facto štandard. V tomto článku prejdeme kompletnú konfiguráciu, kanály, vetvy, postupné rollouty, rollback a čerstvé zmeny z Expo SDK 55.
Microsoft App Center a CodePush boli natrvalo vypnuté 31. marca 2025. EAS Update je oficiálna migračná cesta pre React Native.
EAS Update pracuje s trojicou kanál → vetva → runtime verzia, ktorá presne určuje, ktorá aktualizácia sa dostane ku ktorému zariadeniu.
Expo SDK 55 zaviedol bundle diffing, ktorý znižuje veľkosť aktualizácie o 60–80 % bez potreby konfigurácie.
Postupné rollouty (5 % → 25 % → 100 %) a fingerprint runtime versioning sú v roku 2026 povinný štandard pre produkčné nasadenia.
OTA aktualizácie môžu obsahovať iba zmeny JavaScriptu a assetov. Akákoľvek zmena natívneho kódu vyžaduje novú kompiláciu binárky.
Bezplatný tarif zahŕňa 1 000 mesačne aktívnych aktualizovaných zariadení; platený plán začína na 99 USD/mesiac plus prekročenie.
Čo je EAS Update a prečo CodePush skončil
EAS Update je súčasť platformy Expo Application Services a rieši jeden konkrétny problém: keď máte v produkcii chybu, ktorá je čisto v JavaScripte, nechcete čakať 24 hodín na kontrolu v App Store a ďalších 72 hodín, kým aktualizácia doputuje k väčšine používateľov. S EAS Update publikujete opravu jedným príkazom a zariadenia si ju stiahnu pri ďalšom otvorení aplikácie. V praxi to znamená rozdiel medzi „opravím to o hodinu“ a „ospravedlnenie na Twitteri a prácou cez víkend“.
Prečo je táto téma v roku 2026 taká horúca? Pretože Microsoft oficiálne vypol App Center 31. marca 2025, čím ukončil aj hostovanú službu CodePush. Klientská SDK knižnica react-native-code-push stále existuje v npm, ale nie je čo volať, servery sú offline. Pre tímy, ktoré roky spoliehali na CodePush, sa migrácia stala povinná, nie voliteľná. Expo EAS Update sa počas tohto obdobia stalo najčastejšie odporúčanou náhradou, pretože ponúka rovnakú funkcionalitu (kanály, cielenie podľa verzie, rollbacky), zachováva ju aktívny tím ľudí a integruje sa priamo s Expo Modules API pre natívne moduly. Alternatívy typu Branch, Appsonair alebo vlastné riešenie fungujú, ale prevádzkový overhead je značný a väčšina tímov skončí pri opätovnom vytváraní toho, čo EAS Update dáva out-of-the-box.
Ako funguje EAS Update: kanály, vetvy a runtime verzie
Toto je koncept, ktorý zvládnete raz a už nikdy vám nesplynú príkazy. EAS Update pracuje s tromi navrstvenými pojmami:
Runtime verzia: reťazec, ktorý popisuje kompatibilitu natívneho kódu vášho buildu. Ak sa runtime verzia buildu nezhoduje s runtime verziou publikovaného update-u, klient ho neinstaluje. Toto je bezpečnostná poistka proti pádom.
Vetva (branch): pomenovaný prúd aktualizácií, veľmi podobný Git vetve. Vetva main môže obsahovať desiatky publikácií, každá s vlastným updateId.
Kanál (channel): statická značka zapečená do binárky v čase kompilácie. Bežné hodnoty sú production, preview, staging. Kanál v čase behu ukazuje na jednu vetvu.
Mechanika je jednoduchá. Klient sa spýta „čo je aktuálne na mojom kanáli?“, EAS server nasleduje ukazovateľ z kanála na vetvu a vráti najnovšiu publikáciu, ktorá zodpovedá runtime verzii buildu. Kanál zapečený do binárky je permanentný, ale kam ukazuje, môžete kedykoľvek zmeniť príkazom eas channel:edit. Vďaka tomu je možné celú produkciu presunúť na hotfix vetvu a späť bez toho, aby si ktokoľvek sťahoval novú aplikáciu z obchodu.
Pre runtime verzie odporúčam v roku 2026 používať policy: "fingerprint". Automaticky sa vygeneruje hash všetkých natívnych zdrojov (Podfile, gradle skripty, native moduly) a runtime sa bumpne len vtedy, keď sa tieto veci naozaj zmenia. Manuálne udržiavanie runtime verzie funguje, ale je to jedna z najčastejších príčin nočných incidentov.
Rýchle nastavenie EAS Update v Expo projekte
V mojej praxi vo fintech tíme sme celé nastavenie zvládli za popoludnie. Predpokladám, že máte Expo projekt (spravovaný alebo bare workflow) s SDK 53 alebo novším. Postupujte podľa týchto krokov.
1. Nainštalujte EAS CLI a prihláste sa:
npm install -g eas-cli
eas login
eas whoami # over, že si prihlásený
2. Pridajte expo-updates knižnicu a inicializujte EAS:
npx expo install expo-updates
eas init
eas update:configure
Tento posledný príkaz automaticky nakonfiguruje app.json, pridá runtimeVersion s policy fingerprint a vytvorí projektové ID. Otvorte si výsledný app.json a overte, že vyzerá takto:
eas build --profile preview --platform ios
eas build --profile production --platform all
5. Publikujte prvú aktualizáciu:
eas update --branch preview --message "Prvý OTA test, zmena farby tlačidla"
Otvorte preview build na fyzickom zariadení, force-quitnite aplikáciu a otvorte ju znovu. Aktualizácia sa stiahne na pozadí a aplikuje pri druhom štarte. Ak to funguje, ste pripravení na produkciu.
Čo môžete a nemôžete posielať cez OTA
Toto je hranica, ktorá zvyčajne rozdeľuje tímy na „posielajú s pokojom“ a „posielajú s panikou“. Pravidlo je jednoduché: ak zmena existuje výlučne v JavaScripte, TypeScripte alebo v assets/ priečinku (obrázky, fonty, JSON), môže ísť cez OTA. Ak sa dotkne čohokoľvek iného, potrebujete nový build a novú kontrolu v obchode.
Cez OTA môžete poslať:
Opravy chýb v React komponentoch a hookoch
Zmeny obchodnej logiky, redukcie, selectory, API klienty
Aktualizácie tém, farebných paliet, štýlov
Nové obrázky, ikony, fonty pridané do JS bundlu
Zmeny v knižniciach, ktoré sú čisto JavaScript (napr. lodash, date-fns, zod)
Prepínanie feature flagov cez remote config
Cez OTA nemôžete poslať:
Aktualizáciu React Native, Expo SDK alebo akéhokoľvek natívneho modulu
Nový natívny modul (napr. react-native-mmkv, react-native-reanimated)
Zmeny v Info.plist, AndroidManifest.xml, permission strings
Zmeny v ikone aplikácie, splash screene (tie sú súčasťou natívneho balíka)
Nové expo-* config pluginy alebo ich konfiguráciu
Konfiguračné zmeny v android/ alebo ios/ priečinkoch
Osobné poučenie: raz sme v jednom fintech projekte zabudli, že pridanie novej permission na iOS vyžaduje nový build. Publikovali sme OTA a aplikácia spadla na 40 % zariadení pri pokuse o použitie kamery. Odvtedy máme v deployment runbooku otázku „týka sa tejto zmeny Info.plist?“ ako povinný checkpoint.
Postupné rollouty: 5 % → 25 % → 100 %
V produkcii nikdy neposielajte OTA aktualizáciu naraz všetkým používateľom. To je najistejšia cesta k obnoveniu z rollbacku o polnoci. EAS Update podporuje postupné rollouty priamo v CLI cez parameter --rollout-percentage.
# Publikuj s 0 %, nikto ju ešte nedostane, ale je pripravená
eas update --branch production \
--message "Oprava chyby #4271 v checkout formulári" \
--rollout-percentage 0
# Po overení analytics zvýš na 5 %
eas update:edit --rollout-percentage 5
# O hodinu, ak nič neexploduje, choď na 25 %
eas update:edit --rollout-percentage 25
# Po 24 hodinách bez incidentov spusti plný rollout
eas update:edit --rollout-percentage 100
Dôležitý detail: rollout percentage je sticky per device. Ak zariadenie raz dostalo update pri 5 %, dostane všetky nasledujúce hodnoty percenta rovnako. Nemôžete náhodne prepínať skupiny používateľov. Vďaka tomu je rollout predvídateľný, ale znamená to, že prvých 5 % používateľov musí byť skutočne reprezentatívna vzorka.
V roku 2026 väčšina tímov, ktoré poznám, wire-uje --rollout-percentage 0 priamo do CI/CD pipeline ako default. Potom má separátny manual approval krok, ktorý postupne zvyšuje percento. Toto oddeľuje „publikáciu bundle“ od „aktivácie pre používateľov“, čo je psychologicky veľký rozdiel. Nedelegujete ju juniorovi, ktorý si nie je istý.
Ako rollbackovať zlú aktualizáciu
Existujú tri spôsoby rollbacku a každý má svoje miesto. Naučte sa všetky tri, pretože o 23:47 v noci nechcete listovať dokumentáciou.
Spôsob 1: Republikovať poslednú dobrú verziu na kanál. Toto je najčastejší a najbezpečnejší postup. EAS Update je content-addressed, takže nemôžete „vymazať“ update. Musíte publikovať novšiu verziu, ktorá logikou vráti stav späť. V praxi to znamená checkout git commitu, kde bola posledná dobrá verzia, a spustiť eas update.
git checkout <posledny-dobry-commit>
eas update --branch production \
--message "Rollback: vrátenie na commit abc1234"
Spôsob 2: Použiť oficiálny update:rollback príkaz. Tento príkaz otočí ukazovateľ vetvy na predošlú publikovanú verziu bez potreby prepublikovania:
eas update:rollback --branch production
Spôsob 3: Vrátiť sa na embedded bundle. Ak sa OTA aktualizácia ukázala ako nefunkčná pre všetky verzie a chcete používateľov vrátiť na bundle zapečený v pôvodnej binárke, použite:
eas update:roll-back-to-embedded --branch production
Toto je „núdzová brzda“, používajte ju iba vtedy, ak viete, že embedded bundle je stabilný a novšie OTA sú horšie. V nedávnom incidente pre healthtech klienta sme tento príkaz použili po tom, čo sme omylom zabudli enabnúť hermes v produkcii a aplikácia padala pri štarte v 12 % prípadov.
Bundle diffing v SDK 55: menšie a rýchlejšie updaty
Toto je najväčšia zmena v EAS Update za rok 2026. Do Expo SDK 55 stiahol klient pri každej aktualizácii kompletný JavaScript bundle. Pri väčšej aplikácii to znamenalo 3–5 MB per update. Pre používateľa v pásme s pomalým dátovým pripojením to bolo znateľné oneskorenie a spotreba mobilných dát.
Od SDK 55 klient stiahne iba diff medzi aktuálnym a novým bundlom. V mojich testoch na aplikácii s 2,8 MB bundle dostávame diffy typicky 200–600 KB, čo je zníženie o 78–92 %. Používatelia vidia menšiu spotrebu dát, aktualizácia sa aplikuje rýchlejšie a v niektorých krajinách (napr. India, Indonézia) to reálne mení retention metriky.
Skvelá časť: nie je čo konfigurovať. Stačí byť na SDK 55 alebo novšom s najnovším expo-updates a všetko funguje automaticky. Diffing prebieha na strane servera a klient dostane binary patch, ktorý sa aplikuje na aktuálny cached bundle. Ak diff zlyhá alebo je príliš veľký, klient sa fallbackne na plný bundle, neexistuje spôsob, ako aktualizáciu „zablokovať“ nefunkčným diffom.
Manuálne spúšťanie eas update z lokálneho počítača funguje pre malý projekt, ale nemá čo hľadať v produkcii s viac ako jedným vývojárom. Toto je minimalistický, ale produkciou preverený GitHub Actions workflow:
name: EAS Update
on:
push:
branches: [main]
jobs:
publish-update:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
with:
fetch-depth: 0
- uses: actions/setup-node@v4
with:
node-version: '20'
cache: 'npm'
- name: Nainštaluj závislosti
run: npm ci
- name: Nainštaluj EAS CLI
run: npm install -g eas-cli
- name: Spusti testy
run: npm test -- --ci
- name: Publikuj OTA aktualizáciu na production kanál (0 %)
run: eas update --branch production \
--message "${{ github.event.head_commit.message }}" \
--rollout-percentage 0 \
--non-interactive
env:
EXPO_TOKEN: ${{ secrets.EXPO_TOKEN }}
Kľúčové body: publikujeme s 0 % rolloutom a rollout zvyšujeme manuálne alebo iným workflow-om cez workflow_dispatch. Trigger na main vetvu znamená, že každý merge do main-u vytvorí kandidátsku publikáciu, ale žiadny používateľ ju ešte nevidí. fetch-depth: 0 je dôležité, pretože EAS Update potrebuje git históriu pre správne generovanie updateId.
V roku 2026 Expo tiež oficiálne odporúča EAS Workflows ako natívny CI/CD nástroj. Spúšťa sa priamo na Expo infraštruktúre bez potreby GitHub minutes. Pre menšie tímy to zjednodušuje veci; pre tímy, ktoré už majú investovanú GitHub Actions matriku, sa oplatí zostať pri nej.
Migrácia z CodePush na EAS Update krok za krokom
Ak vám ešte niekde beží starý CodePush kód (a je prekvapivé, koľko tímov ho stále má, lebo aplikácia „funguje“), toto je bezpečná migračná cesta.
Odstráňte react-native-code-push z package.json, Podfile, MainApplication.java a všetkých JS/TS súborov. Grep na codePush je váš priateľ.
Odstráňte CodePushDeploymentKey z Info.plist a strings.xml.
Nainštalujte expo-updates a spustite eas update:configure. Ak nemáte Expo, môžete použiť „bare workflow“ integráciu; funguje aj v čistom React Native projekte.
Mapujte CodePush deployments na EAS kanály:Staging na kanál preview, Production na kanál production. Zaveďte runtime versioning.
Skompilujte a distribuujte nový build. Toto je nevyhnutný krok, používatelia musia mať v ruke binárku, ktorá volá expo-updates, nie CodePush. Starí používatelia zostanú „zamrznutí“ na poslednej CodePush verzii, kým si neaktualizujú aplikáciu z obchodu.
Publikujte prvý OTA cez EAS a monitorujte prevzatie cez dashboard.
Prechodové obdobie zvyčajne trvá 4–8 týždňov, kým väčšina používateľov migruje na nový build. Podľa oficiálneho blogu Expo je táto cesta preverená stovkami tímov v roku 2025 a 2026 a EAS Update tím aktívne pomáha s migráciou pre platené accounty.
Najčastejšie chyby a ako sa im vyhnúť
Tieto sú zoradené podľa toho, ako často som ich videl v konzultačných engagementoch za posledný rok.
1. Zabudnutie na bump runtime verzie
Pridáte nový natívny modul, publikujete OTA a stará binárka nedokáže načítať bundle, ktorý ho volá. Fingerprint policy toto rieši automaticky, ale ak používate manuálny runtimeVersion, potrebujete disciplínu.
2. Publikovanie priamo na production bez preview
Toto je klasika. Vždy najprv publikujte na preview vetvu, otestujte na fyzickom zariadení a až potom cielite production. Preview build s development kanálom je jediný spôsob, ako reálne overiť správanie pred rolloutom.
3. Miešanie kanálov medzi build profilmi
Ak development build nechtiac dostane production kanál, môže dostať produkčnú aktualizáciu, ktorá spôsobí crash. Vyhraďte si čas a jasne definujte v eas.json, ktorý profil má ktorý kanál.
4. Netagovanie crash reportov s updateId
Ak Sentry alebo Bugsnag nevidí, ktorá presne OTA aktualizácia beží na zariadení, ktoré havarovalo, nedokážete debugovať. Nastavte tag automaticky pri štarte aplikácie:
import * as Updates from 'expo-updates';
import * as Sentry from '@sentry/react-native';
Sentry.setTag('updateId', Updates.updateId ?? 'embedded');
Sentry.setTag('channel', Updates.channel ?? 'none');
Sentry.setTag('runtimeVersion', Updates.runtimeVersion);
5. Prekročenie App Store review policy
Apple aj Google povoľujú OTA aktualizácie, ale jasne zakazujú „zásadné zmeny funkcionality“ mimo review procesu. Prakticky to znamená: neposielajte cez OTA nové UI flows, ktoré neboli v review verzii, a neaktivujte funkcie, ktoré by porušovali Guidelines. Feature flags áno, kompletné nové aplikačné módy nie. Pozrite si App Store Review Guidelines, sekciu 3.3.2, pre presné znenie.
Časté otázky
Aký je rozdiel medzi EAS Update a EAS Build?
EAS Build kompiluje natívne binárky (IPA, APK, AAB) v cloude Expo. EAS Update hostuje JavaScript bundle, ktorý sa dá stiahnuť do už nainštalovanej binárky. Používajú sa spolu: EAS Build produkuje binárku, ktorá volá EAS Update pri štarte pre nový bundle.
Je EAS Update zdarma?
Áno, existuje bezplatný tarif zahŕňajúci 1 000 mesačne aktívnych aktualizovaných zariadení a limitované úložisko pre bundle. Platený tarif začína na 99 USD/mesiac s vyššími limitmi a business features. Pre malé projekty a hobby aplikácie je bezplatný tarif zvyčajne dostatočný; pre komerčné aplikácie s desiatkami tisíc používateľov sa oplatí platený plán.
Koľko trvá, kým sa OTA aktualizácia dostane k používateľom?
Klient expo-updates kontroluje CDN pri každom otvorení aplikácie (ak je checkAutomatically: "ON_LOAD"). Ak je nová aktualizácia dostupná, stiahne sa na pozadí a aplikuje pri ďalšom reštarte aplikácie. V praxi väčšina zariadení dostane aktualizáciu do 24–48 hodín, ale aktívni používatelia ju môžu dostať do niekoľkých minút.
Môžem používať EAS Update bez Expo?
Áno. EAS Update funguje aj v čistom React Native projekte (bare workflow) cez expo-updates knižnicu. Nastavenie vyžaduje niekoľko manuálnych krokov v natívnom kóde (úprava AppDelegate.mm a MainApplication.java), ale Expo dokumentácia ich podrobne popisuje. Nemusíte migrovať celý projekt na Expo SDK.
Čo sa stane, ak používateľ otvorí aplikáciu offline?
Aplikácia sa spustí s naposledy stiahnutým bundle uloženým v cache. Ak nikdy nebola online od inštalácie, spustí sa s embedded bundle zapečeným do binárky. EAS Update nikdy nezablokuje spustenie aplikácie kvôli chýbajúcemu pripojeniu. Hodnota fallbackToCacheTimeout definuje, ako dlho čakať na fresh bundle, potom sa použije cached alebo embedded verzia.
Priya is a staff mobile engineer with nine years working in React Native, currently consulting for fintech and healthtech teams shipping on both stores from a single codebase. She spent four years at Klarna on the merchant-facing app, where she led the migration off a legacy Java Android codebase to React Native 0.68 and later drove the New Architecture rollout (Fabric + TurboModules) for roughly 14 million MAU.
Before Klarna she was at Coinbase on the wallet team, writing native bridges to Secure Enclave and Android Keystore. She maintains two small open-source libraries for biometric auth and contributes occasional PRs to react-native-screens. She writes here mostly about performance profiling with Flipper and Hermes, EAS Build pipelines, and the practical headaches of running a brownfield RN app inside a 12-year-old iOS host.
Praktický sprievodca push notifikáciami v Expo pre rok 2026: konfigurácia FCM v1 a APNs, získanie ExponentPushTokenu, odosielanie zo servera, notifikačné kanály na Androide a spracovanie interakcií vrátane cold-startu.
Sprievodca Expo Modules API v roku 2026: od create-expo-module scaffoldu cez Function/AsyncFunction DSL, Records a Convertibles až po natívne View, config plugin a upgrade playbook pre platform tímy.
Ukážem, ako znížiť React Native cold start zo 4,2 s na 1,6 s pomocou bridgeless módu, Hermes bytecode a inline requires. Reálne merania z 6 produkčných aplikácií, Perfetto trace a konfigurácia pre Expo aj bare projekty.