App Store Review Guidelines · 2. Performance

Guideline 2.5.1 public APIs, in plain English

“Apps may only use public APIs and must run on the currently shipping OS.”
Guideline 2.5.1 in Apple's App Review Guidelines

Guideline 2.5.1 says an app may only use the parts of iOS that Apple publishes for developers, its public APIs, and must run on the current version of iOS. Calling hidden, private parts of the system, keeping deprecated technology or using a framework for something it wasn't made for gets an app turned down. The fix is to replace the private call with a public one, or drop the feature.

Checked against Apple’s guidelines on (Apple’s version of ). Apple’s reviewers make the final call.

What Guideline 2.5.1 means

An API is a part of iOS an app calls to do something: take a photo, read the location, show a list. Apple documents the public ones and keeps others private for its own apps. Private ones can change or disappear in any update, which is why Apple doesn't allow them.

Apple also asks you to keep apps up to date and phase out deprecated features, frameworks and technologies that future versions of iOS won't support.

Frameworks must be used for their intended purpose, and the description should say how the app uses them. Apple's examples are HomeKit for home automation and HealthKit for health and fitness with the Health app. Parts of 2.5.1 cover Siri and Shortcuts: register only for intents the app can handle itself, keep vocabulary relevant, and don't put adverts between a request and its result.

Why apps are turned down under Guideline 2.5.1

  • The app uses non-public APIs

    The code reaches a private class, method or framework by name, often through a third-party library that does it without the developer knowing.

  • The app uses a framework for something it isn't for

    A framework's permissions are used to collect data unrelated to its purpose, or the description doesn't say how the app uses it.

  • The app uses deprecated technology

    Old frameworks or features that the current iOS no longer supports, kept in from an earlier version of the code.

How to fix it and resubmit

  1. Read the rejection for the names it lists; Apple often names the private symbols it found.
  2. Search your own code and every library for those names, and update or remove the library that uses them.
  3. Replace each private call with the public API that does the same job, or remove the feature if there's none.
  4. Build again with the current Xcode against the current iOS SDK and fix the deprecation warnings.
  5. Check the description says how the app uses any special framework, upload the new build and resubmit.

How Borel helps

Borel writes apps in Swift with Apple's own frameworks and builds them with Xcode on Borel's Mac against Apple's SDK.

Before you publish, Stamp reads the app's own Swift code for the private parts of iOS that 2.5.1 rules out, such as private selectors and classes reached by name, loading private frameworks, and private system classes, and tells you in plain words which file to change. The fix button hands it to Rivet, who makes the change.

Questions people ask

What is a non-public API?

A part of iOS that Apple uses internally but doesn't publish for developers. Apps may only use the public APIs Apple documents, because private ones can change or vanish in any update.

My code doesn't call private APIs. Why was I rejected?

A library or SDK in the app may call them. Apple holds you responsible for everything in your app, including third-party code, so update or remove the library that does.

Does 2.5.1 mean I must support the newest iOS?

It says apps must run on the currently shipping version of iOS and should phase out deprecated technology. Test on the latest iOS before every submission.

Related guidelines

Words on this page

Make an iPhone app that's ready for review

Describe the app you want and see its first screens before you pay anything.

See your app free