OTA yangilanishlar — EAS Update
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
versionni oshirishni unutdim va OTA yubordim" — eng xavfli xato. Eski build lar yangi kodni oladi va ishga tushmay qoladi.fingerprintsiyosati ("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
previewkanali - 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 qaytarishruntimeVersion— faqat mos native qismga; native o'zgarish →versionoshirish → yangi buildfingerprintsiyosati — native o'zgarishlarni avtomatik aniqlashUpdates.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