Реализация Hot Code Push для React Native-приложения (CodePush)
App Store Review занимает от нескольких часов до нескольких дней. Когда критический баг в JS-логике — опечатка в API endpoint, неправильный расчёт суммы в корзине — нужно доставить фикс немедленно, не ждать ревью. CodePush (Microsoft AppCenter) решает это: JS-бандл и ресурсы обновляются по воздуху, нативный код остаётся прежним.
Как работает CodePush
React Native приложение состоит из нативного хоста (Objective-C/Swift / Java/Kotlin) и JS-бандла. CodePush заменяет JS-бандл и ресурсы (images/, fonts/) без обновления нативной части. Apple и Google это разрешают — при условии, что обновление не меняет поведение приложения принципиально (нельзя через JS добавить новые native permissions или изменить бизнес-модель приложения).
Интеграция
Установка:
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%.
Ограничения и что не работает
CodePush не может обновить:
- Нативный код (Swift/ObjC/Kotlin/Java)
- Нативные зависимости (добавление нового
podилиaar) -
AndroidManifest.xmlиInfo.plist - Splash screen и иконку приложения
Если PR затрагивает нативную часть — стандартный релиз через Store.
CodePush от Microsoft AppCenter объявлен deprecated в пользу EAS Update (Expo). Для проектов не на Expo — рассматриваем миграцию на собственный CodePush-сервер (code-push-server open source) для независимости от AppCenter.
Мониторинг обновлений
AppCenter Deployments показывает статистику: сколько устройств получили обновление, сколько откатились (rollback). Автоматический rollback срабатывает, если приложение крашится сразу после обновления — CodePush возвращает предыдущий бандл.
Процесс
Интеграция SDK → настройка AppCenter приложений → настройка Deployment окружений (Staging, Production) → написание Fastlane lanes → добавление в CI → тест rollout на Staging → документация по процессу деплоя.
Срок: 2–3 дня. Стоимость рассчитывается индивидуально.







