Short answer: yes, Apple allows live updates, within limits. You can push new JavaScript, HTML and CSS to an iOS app without a new App Store review, as long as the update does not change what the app is. You cannot download native code.
Most of the confusion comes from mixing two different things: live updates of interpreted code (allowed) and downloading new executable code (not allowed). This page quotes the rules, shows where the line is, and explains how Apple enforces it.
This is not legal advice. It is how the rules read today and how thousands of apps use them in production.
What Apple’s rules actually say
Two texts matter. The first is App Store Review Guideline 2.5.2:
Apps should be self-contained in their bundles, and may not read or write data outside the designated container area, nor may they download, install, or execute code which introduces or changes features or functionality of the app, including other apps.
Read alone, that sounds like a ban. The exception lives in the second text, section 3.3.1(B) of the Apple Developer Program License Agreement, which every developer signs:
Interpreted code may be downloaded to an Application but only so long as such code: (a) does not change the primary purpose of the Application by providing features or functionality that are inconsistent with the intended and advertised purpose of the Application as submitted to the App Store, (b) does not create a store or storefront for other code or applications, and (c) does not bypass signing, sandbox, or other security features of the OS.
So the rule is not “no downloaded code”. It is “no downloaded native code, and interpreted code only under three conditions”.
A Capacitor app’s web layer is JavaScript, HTML and CSS running in WKWebView, which is Apple’s own WebKit engine. That is interpreted code, so it falls under the exception. Guideline 4.7 points the same way: Apple explicitly lets apps run HTML5 and JavaScript content that is not embedded in the binary.
Where the line is
| Allowed with a live update | Not allowed with a live update |
|---|---|
| Bug fixes in your JavaScript, HTML, CSS | Downloading Swift, Objective-C or any compiled binary |
| UI changes, copy changes, new screens in your existing web stack | Changing the app into a different product (a notes app becoming a casino) |
| A/B tests and gradual rollouts of web code | Unlocking features hidden from App Review |
| Updating images, translations, config | Building a store that installs other apps or code |
| Rolling back a bad release | Bypassing the iOS sandbox, signing or permissions |
Capgo only ships the left column. It replaces the web bundle inside your app. Anything native, such as a new Capacitor plugin, a new permission, or an SDK upgrade, still needs a regular App Store release. Capgo’s version targeting makes sure a bundle that needs new native code never reaches an old binary.
How Apple enforces it
Apple judges substance, not technology. Nobody gets pulled for fixing a typo over the air. The pattern Apple goes after is an app that passes review as one thing and becomes another thing afterwards. That is guideline 2.3.1 (no hidden or undocumented features) as much as 2.5.2.
In practice:
- Ship what you would have submitted, just faster.
- Keep every update within the purpose described in your App Store listing.
- Send big feature launches through App Review, and use live updates for fixes and iteration between releases.
- Never use a live update to switch on behavior that reviewers did not see.
If you follow that, live updates are a normal part of shipping an iOS app. React Native teams have done it for years with CodePush and Expo Updates, and Capacitor teams do it with Capgo.
Which stacks can do it on iOS?
The rule allows interpreted code, so it depends on how your framework runs your code. Capacitor, Cordova and Ionic are fully covered because they run in WebKit. React Native can update its JavaScript bundle. Native Swift apps cannot. The full breakdown, stack by stack, is in which stacks can use live updates on iOS.
Where to go next
- Android answer: Does Google allow live updates without Play Store review?
- Stack by stack: iOS and Android
- Enforcement in detail: How Apple enforces OTA update restrictions
- Approval workflow: Capacitor OTA updates: App Store approval guide
- Real rejection stories: App Store refusal horror stories
Ship fixes today, not after review
Capgo live updates push JavaScript, HTML and CSS changes to your Capacitor app in minutes, with channels, rollbacks, delta updates and end-to-end encryption. It is open source and can be self-hosted.
bunx @capgo/cli@latest init
Follow the quickstart to send your first update.