Documentation
On this page

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:

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.