Ship Desk

Rejection decoder › Guideline 2.5.2

Guideline 2.5.2 rejection: apps must be self-contained

Guideline 2.5.2 says an app has to be a self-contained bundle. It may not download or run code that adds or changes its features after review. For a wrapped web app, the question Apple is really asking is: is the thing we reviewed the thing users will get?

Apple decides. This page is our own reading of the App Review Guidelines as of September 2026, not Apple's wording, and following it does not guarantee approval. The current text at developer.apple.com is the authority.

What Apple's message says

Paraphrased: the app downloads, installs or executes code that introduces or changes its features or functionality, so what Apple reviewed can change without a new review. Apple sometimes adds that the app appears to load its main content from a remote server, or that it lets users create and run other apps or code.

The guideline sits next to the developer agreement, which permits some downloaded interpreted code (such as JavaScript) as long as it does not change the app's primary purpose, create a store for other code, or get around signing and the sandbox. That exception is narrower than many live-update tutorials suggest.

Why AI-built apps hit it

Most AI builders produce a website first. The shortest path to an iPhone app is to point a native shell at that website, which is exactly the pattern 2.5.2 is written against:

The same setup often draws a 4.2 finding as well, because a remote site in a shell also tends to feel like a browser tab.

How to fix it, step by step

  1. Check where the app's code comes from. Open capacitor.config.ts (or .json). If server.url is set, the app is loading a remote site.
  2. Bundle the web build. Run your builder's production build, copy it into the native project with npx cap sync, and remove server.url so the app loads from its own files. The app still calls your backend for data; that is normal.
  3. Handle no connection. With local files, you can show a real offline state instead of a failed page load.
  4. Limit live updates to fixes. If you keep a live-update service, use it for bug fixes and content, not new features or a different purpose. Ship new features as a new build that goes through review.
  5. Remove hidden sections. Anything that can be switched on after approval should either be visible to the reviewer now or removed from this build.
  6. If your app runs user-made code, read the current 2.5.2 and 4.7 text closely. Apple allows some education and preview cases with limits; a general "make and run any app" feature is a harder case, and Apple decides.
  7. Upload a new build and explain the change in App Review Information notes.

What to reply in the Resolution Center

Fill in the brackets and delete anything you did not do. Say plainly where the app's code now comes from.

Hello,

Thank you. In build [version], the app's interface and features are bundled in the app binary and no longer load from a remote website. The app contacts our server only for [account data / the user's content]. [If you kept a live-update service: "Over-the-air updates are limited to bug fixes and content, and new features will be submitted for review."]

Best regards,
[Your name]

Related guidelines

Questions

Is loading my website in a Capacitor app a 2.5.2 problem?

It can be. If the app's features all come from a remote URL, what Apple reviewed can change at any time, which is what 2.5.2 is about. Bundling the web build inside the app and calling your server only for data is the usual fix.

Are live updates (over-the-air JavaScript updates) allowed?

Apple's developer agreement permits some downloaded interpreted code if it does not change the app's primary purpose or add features beyond what was reviewed. Using live updates for bug fixes and content is the common reading; shipping new features that way is a risk.

Can my app let users generate and run code?

Some cases are allowed with limits, such as education apps where the code is visible and editable. A general feature that builds and runs new apps inside yours is a harder case. Read the current 2.5.2 and 4.7 text; Apple decides.

Stuck on this rejection?

Paste the full message into the free rejection decoder to see every cited guideline explained, with a reply draft. It runs in your browser and nothing is uploaded.

Or order a rejection fix, $99: we read the full message, find the cause, fix it in your project, upload a new build and draft the reply for your approval. Target turnaround 72 hours from access. Apple still makes the final decision, and its review time is separate.