Урок 09

Обновления и версионирование

Семантическое версионирование

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-Fi
  • NEVER — вручную

Принудительное обновление

Критичный фикс:

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 для команды