EAS Update în React Native: Ghid Complet pentru Actualizări OTA cu Expo în 2026
Configurează EAS Update de la zero, publică prima actualizare OTA în React Native și învață rollout progresiv, rollback rapid și migrarea de la CodePush cu exemple reale de cod și eas.json.
EAS Update este serviciul oficial Expo pentru actualizări over-the-air (OTA) care îți permite să livrezi cod JavaScript și asset-uri noi utilizatorilor tăi React Native în câteva secunde, fără să mai treci prin App Store sau Google Play. În 2026, EAS Update este soluția recomandată de Expo după oprirea Microsoft CodePush și oferă un flux integrat cu runtimeVersion, canale (branches), rollback instant și fingerprinting automat al codului nativ. În acest ghid vei configura EAS Update de la zero, vei publica prima actualizare și vei învăța să gestionezi rollout-uri progresive în producție.
EAS Update livrează bundle-ul JS și asset-urile noi direct utilizatorilor, fără review în magazinele de aplicații.
Configurarea completă durează 10-15 minute și necesită biblioteca expo-updates plus un cont Expo (planul gratuit include 1.000 MAU).
runtimeVersion leagă fiecare update de o versiune specifică de cod nativ ca să prevină crash-urile de compatibilitate.
Canalele (branches) permit fluxuri paralele pentru development, staging și production, cu promovare atomică între ele.
Rollback-ul se face în secunde folosind eas update:republish, revenind la un update publicat anterior.
Microsoft App Center CodePush a fost oficial oprit pe 31 martie 2025, iar EAS Update este calea de migrare recomandată de Expo și de Microsoft.
Ce este EAS Update și cum funcționează
EAS Update este un serviciu hosted care distribuie bundle-uri JavaScript și asset-uri (imagini, fonturi, fișiere JSON) către aplicațiile React Native aflate deja pe dispozitivele utilizatorilor. Când aplicația pornește, biblioteca expo-updates face un request către serverele EAS ca să verifice dacă există o versiune mai nouă pentru canalul și runtimeVersion-ul curent. Dacă există, bundle-ul se descarcă în background, iar la următoarea repornire aplicația încarcă noul cod.
Sub capotă, EAS Update folosește protocolul Expo Updates, o extensie a Metro bundler care generează un manifest semnat criptografic, plus asset-uri delta pentru a reduce dimensiunea descărcării. În 2026, versiunea expo-updates 0.28 (livrată cu Expo SDK 54) suportă atât aplicații managed cât și bare workflow și oferă API-uri programatice precum Updates.checkForUpdateAsync() și Updates.fetchUpdateAsync() pentru control fin în cod. Poți citi specificația completă în documentația oficială Expo Updates.
Diferența față de un release clasic din App Store? Doar codul JS și asset-urile se pot livra OTA. Orice modificare la un modul nativ, la Info.plist, la AndroidManifest.xml sau la dependențele care conțin cod Objective-C/Swift/Kotlin/Java necesită un build nou trimis în magazine. Restricția vine atât de la Apple (secțiunea 3.3.2 din App Store Review Guidelines) cât și de la arhitectura React Native în sine.
Configurare inițială pas cu pas
Presupunem că ai deja un proiect Expo SDK 53+ funcțional. Instalarea EAS Update se face în trei comenzi. Mai întâi, autentifică-te la contul Expo și inițializează configurația EAS:
npm install -g eas-cli
eas login
eas init
Apoi adaugă biblioteca expo-updates și configureaz-o:
npx expo install expo-updates
eas update:configure
Comanda eas update:configure face automat trei lucruri: adaugă câmpul updates.url în app.json, setează un runtimeVersion inițial și pune cheia projectId sub extra.eas. Verifică rezultatul în app.json:
În al treilea rând, rebuild-ul aplicației este obligatoriu. Modificările la runtimeVersion și updates.url ajung în codul nativ, deci un build ulterior este necesar ca aplicația să știe unde să caute update-uri. Folosește eas build --profile production --platform all sau, dacă ești pe bare workflow, cd ios && pod install && cd .. && npx react-native run-ios.
runtimeVersion: cheia compatibilității cu codul nativ
Câmpul runtimeVersion este cea mai importantă setare din EAS Update. El definește o „amprentă” a codului nativ al aplicației, iar EAS servește doar update-uri cu același runtimeVersion ca cel al build-ului instalat. Așa eviți situația în care un bundle JS nou apelează un modul nativ care nu există în versiunea instalată, motiv clasic pentru crash-uri la boot.
Există trei politici principale pe care le poți alege:
policy: "appVersion": runtimeVersion-ul este egal cu version din app.json (ex: „1.4.0"). Simplu și predictibil, dar trebuie să-l bumpezi manual când schimbi cod nativ.
policy: "fingerprint": recomandat începând cu Expo SDK 52. Calculează automat un hash al proiectului nativ folosind @expo/fingerprint. Orice schimbare la o dependință nativă generează un runtimeVersion nou automat.
String literal, de exemplu "runtimeVersion": "42". Control total, dar toată responsabilitatea îți aparține.
În 2026, politica fingerprint este alegerea implicită pentru proiecte serioase. Ea elimină cea mai frecventă cauză de bug-uri OTA, adică publicarea unui update JS pentru un build care nu are dependința nativă necesară. Un exemplu de configurare fingerprint:
EAS Update separă distribuția în două concepte: canale (channels) și branches. Un canal este configurat în build (de ex. production sau staging) și rămâne fix pentru acel binar. Un branch este o linie de update-uri publicate. La runtime, EAS folosește un pointer între canal și branch ca să decidă ce bundle să servească.
Separarea asta permite fluxuri puternice. Publici un update pe branch-ul staging, îl testezi intern, apoi îl promovezi atomic în branch-ul production printr-o singură comandă, fără să reconstruiești bundle-ul. Un flux tipic de configurare arată așa în eas.json:
Fiecare profil de build atașează un canal diferit. Când echipa QA aprobă un update pe staging, îl trimiți în producție cu:
eas channel:edit production --branch staging
Toate aplicațiile din canalul production vor primi imediat bundle-ul de pe branch-ul staging. Comanda e instant și reversibilă, o strategie similară cu cea descrisă în articolul nostru despre autentificare în Expo Router cu Stack.Protected, unde separarea între medii e esențială.
Cum publici prima actualizare OTA
După ce build-ul cu expo-updates este instalat pe cel puțin un dispozitiv de test, publică primul update astfel:
eas update --branch preview --message "Fix login button color"
Comanda face următoarele operațiuni în ordine:
Rulează Metro pentru a genera bundle-urile iOS și Android (poți limita cu --platform ios).
Calculează hash-urile asset-urilor și le comprimă.
Semnează manifestul cu cheia proiectului.
Face upload la infrastructura Expo (CDN-ul Cloudflare, în 2026).
Actualizează pointer-ul branch-ului preview.
Deschide aplicația de test. La primul boot, biblioteca expo-updates descarcă update-ul în background și îl aplică la următoarea repornire. Ca să forțezi verificarea și aplicarea imediată, poți folosi API-ul programatic:
import * as Updates from 'expo-updates';
async function checkForUpdates() {
try {
const result = await Updates.checkForUpdateAsync();
if (result.isAvailable) {
await Updates.fetchUpdateAsync();
await Updates.reloadAsync();
}
} catch (error) {
console.error('Update check failed:', error);
}
}
Rulează checkForUpdates() într-un useEffect la mount, sau la revenirea aplicației din background folosind AppState. Pentru aplicații cu multe imagini, combină acest flux cu strategii de preloading (vezi ghidul nostru despre expo-image și performanța imaginilor) ca să eviți flash-uri vizuale după update.
Rollout progresiv și rollback rapid
Publicarea unui update către 100% dintre utilizatori simultan e riscantă. Sincer, e cel mai bun mod să te trezești cu 500 de tichete în stack peste noapte. EAS Update oferă două mecanisme pentru rollout controlat.
Rollout procentual
Din 2024, EAS a introdus rollout percentages. Publici un update pe un branch nou și îl expui progresiv:
eas update --branch production --message "New checkout flow"
eas channel:rollout production --branch production --percent 10
# Monitorizează Sentry / Firebase Crashlytics 24h
eas channel:rollout production --percent 50
eas channel:rollout production --percent 100
În spatele scenei, EAS folosește un hash stabil al ID-ului dispozitivului ca să decidă ce procent primește update-ul, astfel încât un utilizator care a primit versiunea nouă continuă să o primească și după ce mărești procentul.
Rollback în secunde
Dacă un update strică ceva, ai două opțiuni. Prima e să publici din nou update-ul anterior:
eas update:republish --branch production --group <update-group-id>
Comanda găsește un update publicat anterior după ID și îl setează ca versiune curentă pentru branch. A doua opțiune e să schimbi pointer-ul canalului către un branch stabil:
eas channel:edit production --branch previous-stable
Cum migrezi de la CodePush la EAS Update
Microsoft a anunțat oprirea App Center pe 31 martie 2025, inclusiv a serviciului CodePush. Expo a publicat un ghid oficial de migrare, iar Microsoft îl recomandă direct pe pagina de retirement. Pașii esențiali sunt:
Elimină pachetul react-native-code-push și codul aferent din AppDelegate.mm / MainApplication.java.
Instalează expo-updates (funcționează și în proiecte bare, nu doar Expo managed).
Rulează eas update:configure.
Mapează deployment-urile CodePush (Staging, Production) la canale EAS.
Publică un binar nou care conține expo-updates. Aplicațiile vechi cu CodePush nu vor primi update-uri EAS, deci este un moment de tranziție prin App Store.
Un aspect subtil: CodePush folosea „deployment keys" într-un fișier separat pentru fiecare mediu, iar EAS folosește channels definite în eas.json. Fluxul de promovare din CodePush (appcenter codepush promote) se traduce direct la eas channel:edit. Pentru detalii complete despre semantica migrării consultă ghidul oficial de migrare Expo.
Poți folosi EAS Update fără EAS Build?
Da. EAS Update este independent de EAS Build. Poți construi aplicația cu Fastlane, Xcode Cloud, Bitrise, GitHub Actions sau chiar local, iar apoi să folosești doar serviciul EAS Update pentru livrarea bundle-urilor JS. Singura condiție este ca binarul să conțină expo-updates configurat corect. Flexibilitatea asta e importantă pentru echipe care au deja un pipeline CI/CD stabilit în afara ecosistemului Expo.
Pentru un proiect bare React Native, adaugă expo-updates manual și configurează câmpurile native. Pe iOS, în Expo.plist:
După rebuild, comanda eas update va funcționa identic ca într-un proiect managed.
Prețuri, limite și strategii de optimizare
Modelul de facturare EAS Update în 2026 se bazează pe Monthly Active Users (MAU), adică dispozitive unice care verifică pentru update-uri într-o lună calendaristică. Planul gratuit include 1.000 MAU/lună; planul Production ($99/lună) include 50.000 MAU; planul Enterprise oferă volume mai mari și SLA-uri. Verifică cifrele actuale pe pagina de prețuri Expo.
Aspect
EAS Update
CodePush (oprit)
Self-hosted
Cost la 10k MAU
Gratuit sau $99/lună
Gratuit (până 2025-03-31)
Server + bandwidth
Rollout procentual
Da, nativ
Da
Custom
Rollback instant
Da
Da
Custom
Delta updates
Da
Da
Nu (implicit)
Fingerprinting nativ
Da (SDK 52+)
Nu
Nu
Suport oficial
Activ (Expo)
Fără suport
Doar comunitate
Ca să optimizezi costurile MAU, dezactivează verificările pentru update la fiecare boot dacă nu sunt necesare. Poți folosi updates.checkAutomatically setat pe ON_ERROR_RECOVERY sau NEVER și să declanșezi verificarea manual doar la momente relevante (deschiderea aplicației după 6 ore, apăsarea unui buton „Verifică actualizări" etc.). În ultimul proiect la care am lucrat, mutarea de la auto-check la un check manual o dată pe zi ne-a redus MAU-ul contorizat cu aproape 40%. Pentru contextul mai larg despre optimizarea aplicațiilor React Native, vezi și ghidul nostru despre notificări push în Expo pentru React Native, care folosește un flux similar de check periodic.
Întrebări frecvente
Este EAS Update gratuit?
Da, EAS Update are un plan gratuit care include 1.000 MAU (Monthly Active Users) pe lună. Planul Production, la $99/lună, include 50.000 MAU, iar peste această limită plătești pe pachete adiționale. Pentru aplicații mici și proiecte personale, planul gratuit este suficient.
Care este diferența dintre EAS Update și CodePush?
Ambele oferă actualizări OTA pentru React Native, dar CodePush (Microsoft App Center) a fost oprit pe 31 martie 2025. EAS Update este soluția modernă recomandată, cu suport nativ pentru fingerprinting, rollout procentual, canale flexibile și integrare completă cu ecosistemul Expo, inclusiv pentru proiecte bare React Native.
Pot livra modificări native cu EAS Update?
Nu. EAS Update livrează doar bundle-ul JavaScript și asset-urile (imagini, fonturi, JSON). Orice modificare la un modul nativ, la Info.plist, la AndroidManifest sau la o dependință nativă necesită un build nou și publicare în App Store sau Google Play. Restricția vine atât de la Apple, cât și de la arhitectura React Native.
Cum fac rollback la un update EAS?
Cea mai rapidă metodă este eas update:republish --branch production --group <update-id>, care republică un update anterior ca versiune curentă. Alternativ, poți schimba pointer-ul canalului cu eas channel:edit production --branch previous-stable. Ambele operații se propagă în câteva secunde către utilizatori.
Ce se întâmplă dacă runtimeVersion nu se potrivește?
Dacă runtimeVersion-ul update-ului publicat nu se potrivește cu runtimeVersion-ul binarului instalat, EAS nu va servi acel update dispozitivului. Aplicația va continua să ruleze bundle-ul embedded, ceea ce previne crash-urile cauzate de bundle-uri JS care apelează cod nativ inexistent în binar.