Installation errors
Why an IPA Installs on One iPhone but Not Another
Compare a working and failing iPhone using the exact IPA, embedded profile, UDIDs, OS requirements, install path, and device state.
When an IPA installs on one iPhone but not another, the working phone is a useful control: it shows that the artifact and install path can succeed under at least one device context. It does not prove that the failing phone is authorized or compatible.
Start by proving both phones received the exact same IPA. Then compare device authorization, OS requirements, installation route, and local device state one field at a time.
Step 1: prove the artifact is identical
Calculate the checksum of the IPA before each handoff:
shasum -a 256 ClientApp.ipa
Record the filename, byte size, SHA-256 value, app version/build, delivery URL, and timestamp. If the two phones downloaded different bytes or builds, you do not yet have a device comparison. Fix caching, upload, or release labeling first.
Preserve the exact failing file. Do not re-export before you have captured what differed.
Working-vs-failing comparison matrix
Create one incident record with these fields. Fill both sides with observed values rather than assumptions:
Artifact
- Working iPhone: IPA SHA-256, app version, build number, download URL.
- Failing iPhone: IPA SHA-256, app version, build number, download URL.
- Decision: checksums must match before any device-level conclusion is valid.
Device identity
- Working iPhone: device model, OS version, exact UDID, Apple Developer team registration status.
- Failing iPhone: device model, OS version, exact UDID, Apple Developer team registration status.
- Decision: for Ad Hoc, compare both UDIDs with the profile embedded in this IPA—not only with the current portal list.
App authorization
- Working iPhone: profile membership, team identifier, application identifier, profile expiry.
- Failing iPhone: profile membership, team identifier, application identifier, profile expiry.
- Decision: both devices use the same embedded profile, but only listed devices are authorized for an Ad Hoc build.
Compatibility
- Working iPhone: OS version, device family, available storage, relevant managed-device restrictions.
- Failing iPhone: OS version, device family, available storage, relevant managed-device restrictions.
- Decision: a device can be authorized yet unable to run the build because its environment differs.
Installation path and prior state
- Working iPhone: TestFlight, Xcode, Apple Configurator, or supported OTA path; previous app installed; install time.
- Failing iPhone: exact same fields plus the full visible error.
- Decision: a different route or stale installed app can introduce a separate variable.
This matrix prevents the common mistake of changing signing because two phones merely appear similar.
Inspect the profile inside the delivered IPA
For an Ad Hoc build, the embedded profile is the relevant authorization evidence. Extract and decode it:
mkdir device-compare
unzip -q ClientApp.ipa -d device-compare
APP_PATH="device-compare/Payload/ClientApp.app"
security cms -D -i "$APP_PATH/embedded.mobileprovision" > embedded-profile.plist
plutil -p embedded-profile.plist
Check ProvisionedDevices for both UDIDs, then record the profile UUID, expiration date, team identifier, application identifier, certificate selection, and entitlements. Apple’s profile model binds these facts together; a device entry by itself does not correct an unrelated identity or signing mismatch.
Do not post the decoded profile publicly. Device identifiers and team information belong in a controlled engineering record.
Pattern A: only the working device is in the profile
This is the strongest Ad Hoc-specific explanation. The developer portal may show the failing phone as registered now, while the delivered IPA still embeds a profile generated before it was added.
Repair sequence:
- validate the failing phone’s UDID and team;
- register it if necessary and capacity allows;
- edit or regenerate the correct Ad Hoc profile with the device selected;
- export or authorizedly re-sign a new IPA using that profile;
- inspect the profile inside the new packaged IPA;
- test the exact checksummed replacement on the failing phone.
Use the focused device-not-in-profile guide when this pattern is proven. If the UDID format or source is uncertain, first follow Invalid UDID.
Pattern B: both devices are listed, but compatibility differs
Compare the app’s deployment requirements with each OS version and supported device family. Also check available storage and organizational device-management restrictions. Do not assume the newest phone is automatically compatible; rely on the build’s declared requirements and the exact error.
If the working phone has an older copy of the app, remove it only after recording its version and signing context. A clean install on both devices can eliminate upgrade-state differences, but deleting evidence too early can hide the cause.
When the full alert is “Unable to Install App,” continue with the broader installation diagnostic. When the alert specifically reports verification or integrity, preserve the IPA and use the integrity workflow.
Pattern C: the installation route differs
One phone may have received the app through TestFlight while the other opened a direct IPA URL. One may be connected to Xcode or Apple Configurator while the other uses an OTA manifest. Those are not equivalent tests.
Record the exact path on both devices. For OTA installation, verify that the manifest and IPA URLs are HTTPS and available, the manifest metadata matches the app, and the artifact itself uses a compatible distribution method. For TestFlight, confirm the tester accepted the right invitation and the build is still available.
Do not treat ordinary file download as installation. Hosting cannot add a missing device to an Ad Hoc profile or convert a build to TestFlight.
Pattern D: the artifact or device state is not actually the same
If checksums differ, investigate upload replacement, CDN or browser caching, filename reuse, and mixed build links. If checksums match but only one phone fails, capture:
- the full error text and time;
- whether the same bundle identifier is already installed;
- whether that installed app came from another team or distribution route;
- free storage and restart state;
- network reachability for the actual install path;
- device-management restrictions relevant to installation.
Change one condition at a time. A successful retry after several simultaneous changes does not reveal which condition mattered.
Ordered diagnostic workflow
Use this sequence to keep evidence intact:
- Freeze the IPA: save it and record its SHA-256 value.
- Confirm the handoff: verify both phones received the same bytes and build.
- Capture device facts: model, OS version, exact UDID, and team registration.
- Inspect the embedded profile: compare both UDIDs, expiry, identity, certificate, and entitlements.
- Compare the install route: reproduce the working path on the failing phone if appropriate.
- Capture the exact failure: avoid summarizing every alert as “won’t install.”
- Repair the first proven mismatch: device/profile, compatibility, delivery, or artifact.
- Export and verify a replacement: give it a new checksum and test it on both representative devices.
If neither phone’s UDID is in an alleged Ad Hoc profile, question whether the successful installation came from the same route or whether a prior version remained installed. If both are listed and the signature/profile facts match, stop adding devices and focus on compatibility, install path, and the exact device log.
Prevent the next one-device incident
Maintain a consented tester registry that separates a person’s name from the verified device identifier. For each release, record the approved device set, profile UUID and expiry, source/build identity, IPA checksum, delivery route, and representative-device result.
Run the browser-local iOS Distribution Checklist before sending the build. IPAFlow is in Private Beta for authorized device onboarding and delivery evidence; it does not collect signing credentials or bypass Apple’s device authorization.