Реалізація 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 додати нові нативні дозволи або змінити бізнес-модель додатку).
Інтеграція
Установка:
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 дні. Вартість розраховується індивідуально.







