Development vs Ad Hoc vs Enterprise Provisioning Profiles

The four iOS provisioning profile types side by side: who can install each, how long they last, and how to tell which one a .mobileprovision file is.

Last updated

A provisioning profile is Apple's permission slip for an app. It says who may sign the app, which app it is, which devices it can run on, until when, and which entitlements it may use. Apple signs every profile, and the iPhone checks it before running the app.

There are four kinds for iPhone apps.

The four types

DevelopmentAd hocApp StoreEnterprise (in-house)
ForRunning your app while you build itTest builds for specific peopleThe App Store and TestFlightApps for your own employees
DevicesRegistered devices listed in the profileRegistered devices listed in the profileNone directlyAny device
CertificateDevelopmentDistributionDistributionEnterprise distribution
Xcode exportDebugging (debugging)Release Testing (release-testing)App Store Connect (app-store-connect)Enterprise (enterprise)
AccountPaid membershipPaid membershipPaid membershipApple Developer Enterprise Program

The export names in brackets are the method values for xcodebuild -exportArchive. Before Xcode 15.3 they were development, ad-hoc and app-store.

Development

For running builds on your own devices from Xcode, with the debugger attached. Its entitlements include get-task-allow, which lets a debugger attach. On iOS 16 and later, apps signed this way need Developer Mode turned on.

Ad hoc

For testers outside the App Store. It works like the release app, but only on the devices listed in the profile, up to 100 per device family each membership year. A new tester means registering their iPhone and regenerating the profile. How ad hoc works.

App Store

For uploading to App Store Connect, which is also how builds reach TestFlight. It lists no devices, so an App Store build can't be installed directly on a test iPhone.

Enterprise

For apps a company distributes only to its own employees, through the Apple Developer Enterprise Program. It isn't meant for customers or the public.

How to tell which one you have

Decode the profile, as shown in this guide, or drop it on our profile viewer. Then:

  1. `ProvisionsAllDevices` is present: enterprise.
  2. No device list at all: App Store.
  3. A device list and `get-task-allow` set to true: development.
  4. A device list and `get-task-allow` false: ad hoc.

The certificate name is a clue too: current development certificates are called "Apple Development" and distribution certificates "Apple Distribution".

How long they last

Every profile has an ExpirationDate, usually no more than a year away. When it passes, apps signed with it stop opening and you need a new profile and a new signature. Revoking a certificate also makes its profiles invalid.

Which one to use

  • Debugging on your own iPhone: development.
  • A build for a client or a few testers today: ad hoc. BuildFerry registers each tester's iPhone and re-signs the build for you.
  • A big beta or a public release: App Store, through TestFlight and then the App Store.
  • Internal company apps on an Enterprise account: enterprise.

Questions

What is the difference between a development and an ad hoc profile?

Both list specific registered devices. A development profile uses a development certificate and allows a debugger to attach. An ad hoc profile uses a distribution certificate and behaves like the release app, which is what testers should get.

Can I install an App Store build on my iPhone for testing?

Not directly. App Store profiles list no devices. Upload the build to App Store Connect and install it with TestFlight, or export an ad hoc build instead.

Can I use an enterprise profile to share an app with customers?

No. Apple's Enterprise Program is for proprietary apps distributed to your own employees. Use TestFlight or ad hoc distribution for testers outside your company.

How do I know which type a .mobileprovision file is?

Decode it. ProvisionsAllDevices means enterprise. No device list means App Store. A device list with get-task-allow true is development, and with it false is ad hoc.

Send your first build