React Native Builds, Releases & OTA Updates

Shipping a React Native app is different from deploying a website. Native binaries must be built and signed for each platform, reviewed by Apple and Google, and installed by users who may not update for months. At the same time, React Native apps have an unusual superpower: most of their code is a JavaScript bundle, which can be updated over the air (OTA) without a store release, within the stores' rules.

A mature release process combines reproducible cloud or CI builds, automated signing, store submission, OTA updates for JavaScript-only fixes, staged rollouts, and crash and performance monitoring, so teams can ship frequently and roll back quickly.

TL;DR

Quick Example

An Expo project configuration with build profiles and update channels:

Core Concepts

Build Types

Release builds bundle Hermes bytecode, strip dev tools, and enable optimizations like R8/ProGuard on Android. Always test release builds before shipping, since behavior and performance differ from development.

Building: EAS Build vs Local

Code Signing

Store Submission

Configuration and Environments

Over-the-Air Updates

OTA updates download a new JavaScript bundle and assets at launch (or in the background) and apply them on next start:

Versioning

Monitoring and Rollback

Best Practices

Automate the Whole Pipeline

Build, sign, test, submit, and publish updates from CI (GitHub Actions plus EAS or fastlane) on tags or merges. Manual release steps on one engineer's laptop don't scale, and get forgotten.

Separate Native Changes From JS Changes

Know which changes require a new binary (native dependencies, permissions, SDK upgrades) and which can ship OTA. Fingerprint-based runtime versions enforce it automatically.

Keep a Kill Switch and Force-Update Path

Remote config or feature flags let you disable broken features instantly. A minimum-supported-version check prompts users on dangerously old builds to update.

Test Release Builds on Real Devices

Release-only issues (minification, Hermes bytecode, missing permissions, different network security settings) only appear in release builds. Test them before submission, including upgrade paths from the previous version.

Common Mistakes

Shipping an OTA Update With Native Changes

Publishing a JS bundle that expects a new native module to builds that don't have it crashes the app on launch. Match runtime versions, and ship native changes through the stores.

Embedding Secrets in the App

API secrets in environment variables compiled into the bundle are trivially extractable from the binary. Keep secrets on servers, and use short-lived, user-scoped tokens in the app.

No Source Maps for Crash Reports

Without uploaded source maps and debug symbols, production stack traces are unreadable minified code. Upload them automatically with every build and update.

FAQ

What is EAS Build?

Expo Application Services' cloud build service for React Native apps. It builds iOS and Android binaries on managed infrastructure, manages signing credentials, caches dependencies, and integrates with submission and OTA updates. It works for both Expo-managed and bare React Native projects.

Are OTA updates allowed by Apple and Google?

Yes, within policy. Both allow downloading interpreted code (JavaScript) that doesn't significantly change the app's purpose or introduce features circumventing review. Use OTA for bug fixes and incremental improvements, and ship significant new functionality through store releases.

When do I need a new store build instead of an OTA update?

Whenever native code or configuration changes: adding or upgrading native libraries, changing permissions or entitlements, upgrading React Native or the Expo SDK, or modifying app icons, splash screens, or native settings. JavaScript and asset-only changes can go OTA.

How do I roll back a bad release?

For OTA updates, republish the previous update or use the rollback command. It reaches users on next launch. For store builds, halt the staged rollout and submit a fixed build. Users who already installed the bad version need an update, so design with remote kill switches and minimum-version checks.

Related Topics

References