Быстрая доставка обновлений React Native: Hot Code Push (CodePush)
Представьте: вы нашли критический баг в продакшне — расчёт скидки округляет не туда. Исправление готово, но чтобы попасть к пользователям, нужно пройти ревью App Store, которое длится от 24 часов до недели. Каждый час простоя — потерянные деньги и нервы. CodePush решает проблему: JavaScript-бандл и ресурсы обновляются напрямую, минуя магазины. Мы внедряем CodePush в React Native-приложения, гарантируя корректную настройку, безопасный rollout и rollback на случай ошибок.
Как CodePush обходит ревью магазинов?
React Native приложение состоит из нативного хоста (Objective-C/Swift / Java/Kotlin) и JS-бандла. CodePush заменяет JS-бандл и ресурсы (images/, fonts/) без изменения нативного кода. Apple и Google разрешают такие обновления — при условии, что обновление не меняет поведение приложения принципиально (нельзя через JS добавить новые native permissions или изменить модель распространения). Наш опыт показывает, что правильная настройка CodePush экономит командам недели времени на доставке фиксов.
Почему стоит выбрать CodePush вместо обычного обновления?
Сравните: стандартное обновление через App Store занимает 1–3 дня, а CodePush доставляет патч за минуты. Разница в десятки раз — CodePush в 100 раз быстрее. Кроме того, CodePush позволяет тестировать обновление на небольшой группе пользователей перед полным rollout. Это снижает риск регрессий.
| Критерий | App Store / Google Play | CodePush |
|---|---|---|
| Время доставки | 1–3 дня | 2–5 минут |
| Прохождение ревью | Обязательно | Не требуется (для JS) |
| Rollback | Нет (только новый релиз) | Автоматический при краше |
| Контроль аудитории | 100% | Постепенный (10% → 50% → 100%) |
Как мы настраиваем CodePush: реальный кейс
Установка и интеграция типового проекта:
npm install react-native-code-push npx pod-install # iOS В AppDelegate.mm (iOS):
#import <CodePush/CodePush.h> - (NSURL *)sourceURLForBridge:(RCTBridge *)bridge { #if DEBUG return [[RCTBundleURLProvider sharedSettings] jsBundleURLForBundleRoot:@"index"]; #else return [CodePush bundleURL]; #endif } В главном компоненте:
import CodePush from 'react-native-code-push'; const App = () => { // ... компонент }; const codePushOptions = { checkFrequency: CodePush.CheckFrequency.ON_APP_RESUME, installMode: CodePush.InstallMode.ON_NEXT_RESUME, mandatoryInstallMode: CodePush.InstallMode.IMMEDIATE, }; export default CodePush(codePushOptions)(App); InstallMode.ON_NEXT_RESUME — обновление применяется при следующем выходе из фона, не прерывая пользователя. IMMEDIATE — только для критических обязательных обновлений.
Деплой через Fastlane
lane :codepush_staging do sh("appcenter codepush release-react \ -a MyOrg/MyApp-iOS \ -d Staging \ --description '#{ENV["CHANGELOG"]}' \ --target-binary-version '~1.2'") sh("appcenter codepush release-react \ -a MyOrg/MyApp-Android \ -d Staging \ --description '#{ENV["CHANGELOG"]}' \ --target-binary-version '~1.2'") end --target-binary-version '~1.2' — семвер-выражение. Обновление получат только пользователи с нативной версией 1.2.x. Если новый JS-бандл использует нативный модуль из 1.3, пушить на 1.2 нельзя.
Стратегия rollout: как избежать проблем
Не выкатывайте CodePush сразу на 100% аудитории. AppCenter поддерживает --rollout:
appcenter codepush release-react \ -a MyOrg/MyApp-iOS \ -d Production \ --rollout 10 10% пользователей получают обновление. Через 30 минут смотрим Firebase Crashlytics — если crash rate не вырос, расширяем через AppCenter UI до 50% → 100%.
Что входит в работу: deliverables
Настройка CodePush включает:
| Что делаем | Результат |
|---|---|
| Анализ архитектуры и подготовка dev-окружения | Отчёт о совместимости, план внедрения |
| Интеграция SDK и настройка AppCenter | Рабочий билд с CodePush в Staging |
| Автоматизация через Fastlane и CI | Скрипты релиза, pipeline в GitLab CI / GitHub Actions |
| Настройка мониторинга и алертов | Дашборд AppCenter, интеграция с Crashlytics |
| Документирование и обучение команды | Инструкция по выпуску обновлений, чек-лист rollout |
Этапы работы
- Аналитика (2–4 часа): аудит текущей архитектуры, проверка совместимости с CodePush, определение target binary версий.
- Проектирование (2–4 часа): выбор схемы проверки обновлений, plan rollout и fallback.
- Интеграция (4–8 часов): установка SDK, конфигурация AppCenter, правка кода для поддержки CodePush.
- Автоматизация (4–8 часов): Fastlane-скрипты, CI-пайплайн.
- Тестирование (2–4 часа): rollout на Staging, мониторинг крашей, тестирование rollback.
- Запуск (1–2 часа): rollout на Production с постепенным расширением.
Ограничения и что не работает
CodePush не может обновить:
- Нативный код (Swift/ObjC/Kotlin/Java)
- Нативные зависимости (добавление нового pod или aar)
- AndroidManifest.xml и Info.plist
- Splash screen и иконку приложения
Если PR затрагивает нативную часть — требуется стандартный релиз через магазин. CodePush от Microsoft AppCenter объявлен deprecated в пользу EAS Update (Expo). Для проектов не на Expo мы рассматриваем миграцию на собственный сервер code-push-server, чтобы сохранить независимость от AppCenter.
Мониторинг обновлений
AppCenter Deployments показывает статистику: сколько устройств получили обновление, сколько откатились. Автоматический rollback срабатывает при краше сразу после обновления — CodePush возвращает предыдущий бандл.
Согласно документации AppCenter, CodePush использует прогрессивный rollout для минимизации рисков.
Дополнительно: что такое CodePush на самом деле
CodePush — это облачный сервис, который позволяет разработчикам развертывать обновления мобильных приложений напрямую на устройства пользователей. Он работает с React Native и Cordova, заменяя только веб-ресурсы (JS, HTML, CSS, изображения).Опыт и гарантии
У нас 6 лет опыта в разработке React Native. Мы внедрили CodePush для десятков проектов: финтех, маркетплейсы, социальные сети. Гарантируем стабильность обновлений, быстрый откат и полную документацию процесса. Свяжитесь с нами для бесплатной консультации — оценим ваш проект и предложим оптимальную стратегию внедрения CodePush. Закажите настройку под ключ и забудьте о долгих ожиданиях ревью.







