Обновления и версионирование
Семантическое версионирование
MAJOR.MINOR.PATCH
1.2.3
- MAJOR — несовместимые изменения
- MINOR — новая функциональность
- PATCH — исправления
Номера сборок
В app.json:
{
"expo": {
"version": "1.2.3",
"ios": {
"buildNumber": "42"
},
"android": {
"versionCode": 42
}
}
}
version— версия для пользователяbuildNumber/versionCode— номер сборки для стора
Автоинкремент
В eas.json:
{
"build": {
"production": {
"autoIncrement": true
}
}
}
EAS сам увеличит номер при каждой сборке.
OTA-обновления
EAS Update обновляет JS без публикации в сторах:
eas update --branch production --message "Fix login bug"
Пользователи получают при следующем запуске.
Что можно обновлять:
- JS-код
- Стили
- Изображения
- Тексты
Что нельзя:
- Нативные модули
- Разрешения
- Иконка
- Splash screen
- Версия приложения
Runtime version
EAS Update проверяет runtimeVersion. Если не совпадает — обновление не применится.
{
"expo": {
"runtimeVersion": "1.0.0"
}
}
Меняешь runtimeVersion при нативных изменениях.
Политика EAS Update
{
"expo": {
"updates": {
"enabled": true,
"checkAutomatically": "ON_LOAD",
"fallbackToCacheTimeout": 0,
"url": "https://u.expo.dev/PROJECT_ID"
}
}
}
checkAutomatically:
ON_LOAD— при каждом запускеON_ERROR_RECOVERY— только после крашаWIFI_ONLY— только на Wi-FiNEVER— вручную
Принудительное обновление
Критичный фикс:
import * as Updates from 'expo-updates';
await Updates.fetchUpdateAsync();
await Updates.reloadAsync();
Проверка версии API
Сервер может требовать минимальную версию:
const { minVersion } = await api.get('/config');
if (compareVersions(currentVersion, minVersion) < 0) {
Alert.alert('Обновите приложение', 'Новая версия доступна в сторе', [
{ text: 'Обновить', onPress: () => Linking.openURL(storeUrl) },
]);
}
Staged rollout
Развёртывание постепенно:
- App Store: Phased Release 1%→100% за 7 дней
- Google Play: Staged rollout 1%, 5%, 10%, 20%, 50%, 100%
Если краши растут — остановить.
Changelog
Вести список изменений для пользователей и команды:
## 1.2.3
- Исправлен баг с логином
- Улучшена производительность списка
## 1.2.2
- Новая функция: шаринг
Итоги
- Semver: MAJOR.MINOR.PATCH
buildNumber/versionCodeдля стораautoIncrementвeas.json- OTA для JS, нативные — новая сборка
runtimeVersionдля совместимости- Staged rollout для безопасности
- Changelog для команды