We’re planning to distribute our app outside of TestFlight because our testing period is expected to exceed the 90-day limit. Since we have an Apple Developer account, we’re considering using either Ad Hoc distribution or direct installation (debug/development builds) for longer-term testing.
I have a few questions regarding this approach:
Ad Hoc Distribution Validity What is the effective validity period of an Ad Hoc build? We’re aiming for long-term testing (4-5 months) and would like to avoid unexpected expiration—are there any constraints we should be aware of?
Development/Debug Build Expiry & Limitations If we distribute the app using a development (debug) build via provisioning profiles, what is the expiration timeline? Are there practical limitations (e.g., device limits, performance differences, or provisioning renewal requirements) that could impact extended testing?
Potential Complications & Best Practices Are there any issues we should anticipate when using these distribution methods for long-term testing? For example: Provisioning profile or certificate expiration Device registration limits Any policy or compliance considerations with Apple
We’d appreciate any guidance or best practices for managing long-term testing outside of TestFlight while staying within Apple’s guidelines.
What is the effective validity period of an Ad Hoc build?
My understanding is that:
- This is gated by the app’s provisioning profile.
- Ad Hoc provisioning profiles live for about a year.
However, you can check this for yourself by dumping the provisioning profile. TN3125 Inside Code Signing: Provisioning Profiles explains how to do that.
IMPORTANT Some types of provisioning profiles have an ExpirationDate property, which makes the expiration date very clear. In others you have to combine the CreationDate property and the TimeToLive property, the latter being a count of days.
Development provisioning profiles have a similar limit, and you can work that out in the same way.
If we distribute the app using a development (debug) build via provisioning profiles, what is the expiration timeline?
You need to distinguish between:
- Build configuration (Debug or Release)
- Code signing (Development, Release, Ad Hoc, and so on)
The build configuration does not generally affect the behaviour of your app, although there are some cases where apps can inadvertently change behaviour between debug and release builds. I talk about that idea in more detail in Isolating Code Signing Problems from Build Problems.
When it comes to code signing, there are important differences between development and distribution signing:
- Development provisioning profiles allow you to enable debugging via the get-task-allow entitlement. Distribution provisioning profiles, including Ad Hoc, do not.
- That can, in turn, have knock-on effects. For example, Network Extension will enable certain debug-only facilities based on the presence of the get-task-allow entitlement.
- If a service has a development-focused environment — including sandbox environments for things like push notifications and StoreKit — a development provisioning profile will force you to use that, whereas a distribution provisioning profile will force you to use the production one.
Share and Enjoy
—
Quinn “The Eskimo!” @ Developer Technical Support @ Apple
let myEmail = "eskimo" + "1" + "@" + "apple.com"