Are OTA updates allowed on the App Store and Google Play?#
Yes — with limits that both stores state explicitly. Apple and Google each draw the same line: an installed app may fetch and run new interpreted code, such as a JavaScript bundle, but may not fetch new native executable code, and an update may not turn the app into something different from what was reviewed. React Native OTA updates work precisely because they sit on the permitted side of that line.
This page summarizes what each policy says and how to stay inside it. It reflects the policies as published in September 2026 and is not legal advice; always check the current text, linked below, before relying on it.
What Apple's rules say#
Two Apple documents govern code an iOS app downloads after installation.
App Store Review Guideline 2.5.2 requires apps to be self-contained: an app may not download, install, or execute code that introduces or changes its features or functionality, with a narrow exception for educational apps that teach programming.
The Apple Developer Program License Agreement then carves out the case OTA updates rely on: interpreted code may be downloaded to an app, provided it does not change the app's primary purpose, does not create a store or storefront for other code or apps, and does not bypass signing, sandboxing, or other OS security features.
Read together: shipping a revised JavaScript bundle to an app whose purpose stays the same is within the agreement. Shipping new native code, or using an update to become a materially different app than the one Apple reviewed, is not.
What Google Play's rules say#
Google Play's Device and Network Abuse policy states that an app distributed through Google Play may not modify, replace, or update itself by any mechanism other than Google Play's own, and may not download executable code — dex, JAR, or .so files — from any other source.
The same policy then makes the exception OTA updates depend on: the restriction does not apply to code that runs in a virtual machine or an interpreter providing indirect access to Android APIs, giving JavaScript in a webview or browser as the example.
A React Native OTA update replaces the JavaScript bundle executed by the engine compiled into the app binary. The native binary itself — the thing Google Play's restriction protects — is only ever updated through the store.
Staying inside the boundary#
The policies reduce to four working rules:
- Ship only JavaScript and assets over the air. Images, fonts, and JSON ride along with the bundle. Anything that changes the compiled binary — a new native module, a React Native upgrade, a manifest or entitlement change — goes through a store submission.
- Keep the app's purpose stable. Bug fixes, new screens built from native capabilities already in the binary, copy and styling changes, and API changes are the intended use. Turning a reviewed app into a different product via an update is what both policies exist to prevent.
- Never use an update to unlock what review would have questioned. Hiding functionality during review and enabling it afterward is grounds for removal on both stores regardless of the delivery mechanism.
- Match bundles to compatible binaries. An update built against a native surface the installed binary does not have will crash it. This is an engineering constraint rather than a policy one, but it is what makes the policy line practical to hold: the update system must know which binaries an update fits.
How Rollbird stays inside it#
Rollbird only ships JavaScript bundles and their assets — there is no mechanism for delivering native code. rollbird init embeds a fingerprint of the app's native build alongside its channel, and the update check refuses to serve a bundle to a binary whose fingerprint does not match, so a store-submitted native change never collides with an over-the-air one. Bundles are signed at release and verified on the device before they install.
The OTA updates explainer covers the JavaScript-versus-native boundary in more depth, and the getting-started guide walks through shipping a first compliant update end to end.