React Native CodePush: Fast OTA Updates
Imagine: you find a critical bug in production — discount calculation rounds incorrectly. The fix is ready, but to reach users, it must pass App Store review, taking 24 hours to a week. Every hour of downtime costs money and nerves. CodePush solves this: the JavaScript bundle and resources update directly, bypassing stores. We integrate CodePush into React Native apps, ensuring correct configuration, safe rollout, and rollback in case of errors.
How CodePush Bypasses Store Review
A React Native app consists of a native host (Objective-C/Swift / Java/Kotlin) and a JS bundle. CodePush replaces the JS bundle and resources (images/, fonts/) without changing native code. Apple and Google allow such updates — provided the update does not fundamentally change app behavior (e.g., adding native permissions or altering distribution model). Our experience shows that proper CodePush setup saves teams weeks on fix delivery.
Why Choose CodePush Over Regular Updates
Compare: a standard App Store update takes 1–3 days, while CodePush delivers a patch in minutes — a 100x difference. Additionally, CodePush lets you test updates on a small user group before full rollout, reducing regression risk.
| Criteria | App Store / Google Play | CodePush |
|---|---|---|
| Delivery time | 1–3 days | 2–5 minutes |
| Review required | Yes | No (for JS) |
| Rollback | Only new release | Automatic on crash |
| Audience control | 100% at once | Gradual (10% → 50% → 100%) |
How We Set Up CodePush: A Real Case
Installation and integration for a typical project:
npm install react-native-code-push npx pod-install # iOS In AppDelegate.mm (iOS):
#import <CodePush/CodePush.h> - (NSURL *)sourceURLForBridge:(RCTBridge *)bridge { #if DEBUG return [[RCTBundleURLProvider sharedSettings] jsBundleURLForBundleRoot:@"index"]; #else return [CodePush bundleURL]; #endif } In the main component:
import CodePush from 'react-native-code-push'; const App = () => { // ... component }; 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 applies the update on next resume, not interrupting the user. IMMEDIATE is only for critical mandatory updates.
Deployment via 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' is a semver expression. Only users with native version 1.2.x receive the update. If a new JS bundle uses a native module from 1.3, it cannot be pushed to 1.2.
Rollout Strategy: How to Avoid Problems
Never push CodePush to 100% audience immediately. AppCenter supports --rollout:
appcenter codepush release-react \ -a MyOrg/MyApp-iOS \ -d Production \ --rollout 10 10% of users get the update. After 30 minutes, check Firebase Crashlytics — if crash rate hasn't increased, expand via AppCenter UI to 50% → 100%.
What's Included: Deliverables
CodePush setup includes:
| What we do | Result |
|---|---|
| Architecture analysis and dev environment prep | Compatibility report, implementation plan |
| SDK integration and AppCenter configuration | Working build with CodePush in Staging |
| Automation via Fastlane and CI | Release scripts, pipeline in GitLab CI / GitHub Actions |
| Monitoring and alert setup | AppCenter dashboard, Crashlytics integration |
| Documentation and team training | Update release guide, rollout checklist |
Work Stages
- Analysis (2–4 hours): audit current architecture, check CodePush compatibility, determine target binary versions.
- Design (2–4 hours): choose update check frequency, plan rollout and fallback.
- Integration (4–8 hours): SDK installation, AppCenter configuration, code changes for CodePush support.
- Automation (4–8 hours): Fastlane scripts, CI pipeline.
- Testing (2–4 hours): rollout on Staging, crash monitoring, rollback testing.
- Launch (1–2 hours): rollout to Production with gradual expansion.
Limitations and What Doesn't Work
CodePush cannot update:
- Native code (Swift/ObjC/Kotlin/Java)
- Native dependencies (adding a new pod or aar)
- AndroidManifest.xml and Info.plist
- Splash screen and app icon
If a PR touches native code, a standard store release is required. CodePush from Microsoft AppCenter is deprecated in favor of EAS Update (Expo). For non-Expo projects, we consider migrating to a custom code-push-server to maintain independence from AppCenter.
Monitoring Updates
AppCenter Deployments shows statistics: how many devices received the update, how many rolled back. Automatic rollback triggers on crash immediately after update — CodePush returns the previous bundle.
According to AppCenter documentation, CodePush uses progressive rollout to minimize risks.
Additional: What CodePush Actually Is
CodePush is a cloud service that lets developers deploy mobile app updates directly to users' devices. It works with React Native and Cordova, replacing only web resources (JS, HTML, CSS, images).Experience and Guarantees
We have 6 years of experience in React Native development. We've implemented CodePush for dozens of projects: fintech, marketplaces, social networks. We guarantee stable updates, fast rollback, and complete documentation. Contact us for a free consultation — we'll assess your project and suggest the optimal CodePush strategy. Order a turnkey setup and forget about long review waits.







