OTA yangilanishlar — EAS Update

~12 daq · React Native · Nashr qilish

Muammodan boshlaylik

Ilova do'konlarda. Juma kuni kechqurun foydalanuvchilar yozadi: "To'lov tugmasi ishlamayapti". Xato topildi — bitta qator JavaScript.

Oddiy yo'l: yangi build (20 daqiqa) → do'konga yuborish → ko'rib chiqish (App Store — 1-2 kun) → foydalanuvchilar yangilashini kutish (ko'pchilik avtomatik yangilanishni o'chirib qo'ygan — haftalar). Shu vaqt davomida — to'lovlar yo'q.

OTA (Over-The-Air) yangilanish — JavaScript kodini do'konni chetlab, to'g'ridan-to'g'ri foydalanuvchilar telefoniga yuborish. Daqiqalarda.


Qanday ishlaydi

React Native ilovasi ikki qismdan iborat:

┌──────────────────────────────┐
│ Native qism (Kotlin / Swift) │ ← build da yasaladi, do'kon orqali yangilanadi
│  ┌────────────────────────┐  │
│  │ JS bundle + rasmlar    │  │ ← OTA bilan almashtirish MUMKIN
│  └────────────────────────┘  │
└──────────────────────────────┘

Ilova ishga tushganda yangi JS bundle bormi deb serverdan so'raydi. Bor bo'lsa — fonda yuklab oladi va keyingi ishga tushishda qo'llaydi.


Sozlash

npx expo install expo-updates
eas update:configure

app.json ga yangilanish URL i va runtimeVersion qo'shiladi:

{
  "expo": {
    "runtimeVersion": { "policy": "appVersion" },
    "updates": { "url": "https://u.expo.dev/<projectId>" }
  }
}

eas.json da har bir build profili o'z kanaliga bog'lanadi:

"build": {
  "preview": { "channel": "preview", "distribution": "internal" },
  "production": { "channel": "production", "autoIncrement": true }
}

Shundan keyin yangi build yasang — OTA faqat expo-updates o'rnatilgandan keyingi build larda ishlaydi.


Yangilanish yuborish

eas update --channel production --message "To'lov tugmasi tuzatildi"

Bir necha daqiqada — production kanalidagi barcha ilovalar keyingi ochilishda yangi kodni oladi.

Sinovchilar uchun avval:

eas update --channel preview --message "Yangi filtr"

Tekshirib bo'lgach — production ga.

Qaytarish (rollback)

Yangilanish yangi xato keltirdi?

eas update:rollback

Yoki expo.dev → Updates → oldingi yangilanishni qayta nashr qilish. Daqiqalarda — hamma eski versiyaga qaytadi.


runtimeVersion — eng muhim tushuncha

OTA faqat JavaScript ni almashtiradi. Agar yangi kod native kutubxonaga tayansa, lekin foydalanuvchining ilovasida bu kutubxona yo'q bo'lsa — ilova yiqiladi.

runtimeVersion — "bu JS qaysi native qism bilan mos". Yangilanish faqat bir xil runtimeVersion li build larga tushadi.

"runtimeVersion": { "policy": "appVersion" }

appVersion siyosati: version: "1.2.0" — runtime "1.2.0". Native o'zgarish qilsangiz — version ni oshirasiz → yangi build → do'kon. Eski 1.2.0 foydalanuvchilariga yangi JS bormaydi — ular yiqilmaydi.

O'zgarish OTA mumkinmi
JS/TS kodidagi xato tuzatish ✅
Matn, stil, yangi ekran (mavjud kutubxonalar bilan) ✅
Rasmlar (assets) ✅
Yangi native kutubxona (npx expo install expo-camera) ❌ — yangi build
app.json dagi plaginlar, ruxsatlar, ikonka, nom ❌ — yangi build
Expo SDK yangilanishi ❌ — yangi build

[!WARNING] "Native kutubxona qo'shdim, lekin version ni oshirishni unutdim va OTA yubordim" — eng xavfli xato. Eski build lar yangi kodni oladi va ishga tushmay qoladi. fingerprint siyosati ("policy": "fingerprint") native o'zgarishlarni avtomatik aniqlaydi va bu xavfni kamaytiradi.


Yangilanishni boshqarish ilova ichida

Standart: yuklab olinadi, keyingi ishga tushishda qo'llanadi. Muhim tuzatish uchun — darhol:

import * as Updates from 'expo-updates';

async function yangilanishniTekshir() {
  if (__DEV__) return;          // development da ishlamaydi
  try {
    const t = await Updates.checkForUpdateAsync();
    if (t.isAvailable) {
      await Updates.fetchUpdateAsync();
      Alert.alert('Yangilanish tayyor', 'Ilova qayta ishga tushirilsinmi?', [
        { text: 'Keyinroq', style: 'cancel' },
        { text: 'Hozir', onPress: () => Updates.reloadAsync() },
      ]);
    }
  } catch {
    // tarmoq yo'q — keyingi safar
  }
}

Yoki hook:

const { isUpdateAvailable, isUpdatePending } = Updates.useUpdates();

Joriy versiyani ko'rsatish (sozlamalar ekranida, yordam uchun):

<Text>Versiya: {Constants.expoConfig?.version} ({Updates.updateId?.slice(0, 7) ?? 'build'})</Text>

Qoidalar va odob

  • Do'kon qoidalari: Apple va Google OTA ni ruxsat beradi — xatolarni tuzatish va kichik yaxshilanishlar uchun. Ilovaning asosiy maqsadini o'zgartirish yoki ko'rib chiqishni chetlab o'tish uchun yangi funksiya qo'shish — qoidabuzarlik
  • Sinovsiz yubormang: OTA — tez, demak xato ham tez tarqaladi. Avval preview kanali
  • Bosqichma-bosqich: eas update --rollout-percentage 10 — avval 10% ga
  • Monitoring: Sentry (5-dars) — yangilanishdan keyin xatolar ko'paydimi

Nima uchun shunday?

Nima uchun React Native da OTA mumkin, native ilovalarda esa yo'q?

Native ilovaning kodi — oldindan kompilyatsiya qilingan mashina kodi. Uni almashtirish — butun ilovani almashtirish, va do'konlar buni faqat o'z kanali orqali ruxsat beradi. React Native ilovasida esa mantiqning katta qismi — JavaScript bundle, ya'ni ilova ishga tushganda o'qiladigan fayl. Bu faylni almashtirish — ma'lumotni yangilashdek gap: native qism o'zgarmaydi. Shuning uchun Apple va Google buni ruxsat beradi — ma'lum chegaralar ichida. Bu React Native ning native dasturlashdan eng katta amaliy afzalliklaridan biri.


Xulosa

Eslab qoling:

  • OTA — JS va rasmlarni do'konsiz yangilash; keyingi ishga tushishda qo'llanadi
  • expo-updates + eas update:configure + yangi build
  • Kanallar: preview, production; eas update --channel ... --message ...
  • eas update:rollback — tez qaytarish
  • runtimeVersion — faqat mos native qismga; native o'zgarish → version oshirish → yangi build
  • fingerprint siyosati — native o'zgarishlarni avtomatik aniqlash
  • Updates.checkForUpdateAsync / fetchUpdateAsync / reloadAsync — ilova ichida
  • Xato tuzatish uchun — ha; ko'rib chiqishni chetlab o'tish uchun — yo'q

Keyingi dars

52-dars: Yakuniy loyiha — do'kon ilovasi