iOS distribution
Ad Hoc, UDIDs, device enrolment, and why apps stop launching.
iOS installs over the air, the same way it has always worked outside the store. What you can install onto depends on how the build was signed, and this is the part that catches people out.
Ad Hoc versus Enterprise
With a standard Apple Developer Program account, builds are signed Ad Hoc. An Ad Hoc provisioning profile contains a fixed list of device UDIDs, decided when the build was signed. A device that is not in that list cannot install the build, no matter how the link was shared. With an Apple Enterprise account, builds install on any device.
Each iOS build shows how many devices its profile covers, and which of your registered devices are among them — so 'it will not install for me' is answerable before you start guessing.
Collecting UDIDs
Send a new tester the enrolment link. Opening it on an iPhone installs a temporary configuration profile that reports the device's UDID back, and the device appears under Devices with its model and name. Add those UDIDs to your provisioning profile, re-sign, and upload the new build.
- Send the enrolment link and have them open it in Safari
- Copy the collected UDIDs from the Devices page
- Add them to the Ad Hoc profile in the Apple Developer portal
- Re-sign the app with the updated profile and upload it here
Profile expiry
Every iOS build shows its profile expiry date, and warns from 30 days out. Re-sign and re-upload before then; there is nothing that can be done from this end once a profile has lapsed.
If an install fails
| What they see | Usually means |
|---|---|
| 'Unable to install' | The device's UDID is not in the build's profile |
| Installs, then will not open | The profile has expired, or the device is not trusted |
| Nothing happens on tap | Opened in an in-app browser rather than Safari |
| 'Untrusted developer' | Settings → General → VPN & Device Management, then trust |