Работает

Правка уезжает пользователям, минуя ревью сторов

Собрали правку в шесть — у пользователей она в шесть ноль пять: приложение скачало обновление само и применило при следующем запуске. Меняется интерпретируемый код и ассеты; нативный остаётся в сборке.

Публикация правки в канал prod и откат к предыдущему обновлению. Манифест каждого обновления подписан приватным ключом приложения — клиент проверяет подпись до применения.

Как это работает

Шаг 1

Подключаете штатный клиент

Клиент — библиотека expo-updates: переход стоит одного URL в конфигурации. Аккаунт Expo не нужен, EAS не нужен. Работает и managed Expo, и bare React Native: otapush init патчит app.json, а если его нет — AndroidManifest.xml и Expo.plist.

Шаг 2

Публикуете правку в канал

Каналы dev, staging и prod; у каждой платформы состояние своё, поэтому хотфикс для iOS не заденет Android. Манифест каждого обновления подписан приватным ключом вашего приложения — RSA-2048, PKCS#1 v1.5, SHA-256. Пара ключей и self-signed X.509-сертификат на 10 лет выпускаются при создании приложения.

Шаг 3

Приложение обновляется само

Устройство проверяет подпись до применения обновления и применяет его со второго запуска: первый скачивает бандл, второй запускает. Откат возвращает канал на предыдущее обновление, откат за самым первым — на бандл, зашитый в сборку.

Что это снимает с человека

Правка доходит до пользователей при следующем запуске приложения, а не после ревью. Плановый релиз со сторами остаётся для нативных изменений.

Законность описана в правилах самих сторов: лицензионный договор Apple §3.3.1(B) разрешает загрузку интерпретируемого кода, в правилах Google Play есть исключение для языков, исполняемых в интерпретаторе. JS-бандл и ассеты — ровно этот случай.

Уход от App Center, закрытого 31 марта 2025 года, стоит одного URL в конфигурации: сервер Otapush реализует открытый Expo Updates Protocol — версии v1 и v0, — а клиент остаётся штатным.

Условия и деньги

  • MAU

    Считаем уникальные устройства, которые за календарный месяц пришли за обновлением. Публикации, каналы и трафик — мимо счётчика. При превышении лимита раздача продолжается.

  • Цены

    Черновые; финальные объявим до включения оплаты. Пока действует бесплатный план: одно приложение и 10 уникальных устройств в месяц. Если вы не в России, напишите нам на почту.

  • Сборка

    Бинарники собирает ваш CI: Otapush — слой доставки обновлений, а не замена сборочному сервису.

Обновление касается интерпретируемого кода и ассетов; нативные изменения идут через сборку и ревью сторов как обычно.

Вопросы

Что нужно устройству?

Стабильный идентификатор устройства. Приложение один раз при старте вызывает Updates.setExtraParamAsync("deviceid", id) — и сервер узнаёт его при каждом обращении. Без идентификатора сервер отвечает ошибкой, а случайный UUID при каждом запуске раздувает счётчик MAU.

Где взять CLI?

Выдаём при регистрации. Команды: login, whoami, init, publish, rollback, promote, list, keys. Основные: publish --channel <имя> --platform ios|android|all, promote --from <канал> --to <канал>, rollback --channel <имя>.

Что записывается в журнал?

IP-адрес и User-Agent в журнал запросов не записываются. API-ключ хранится в виде хеша SHA-256 и префикса из 12 символов.

Откройте кабинет и опубликуйте первую правку

Открыть кабинет

Вопрос по сервису — почта студии: tea@aistastudio.ru