We distribute an enterprise iOS app using the itms-services:// protocol for OTA updates. The update flow is triggered from within the running app itself via React Native's Linking.openURL():
`itms-services://?action=download-manifest&url=https://[our-server]/manifest.plist
Expected behavior (works on iOS 18.7.2):
- User taps "Update" inside the app
- Linking.openURL() opens the itms-services URL
- iOS shows the system "Install" confirmation dialog
- User taps "Install"
- iOS automatically closes/backgrounds the running app
- Installation proceeds and completes
Actual behavior (broken on iOS 26.7, 26.6, 26.5): Steps 1–4 are identical, but at step 5 the app remains in the foreground and the installation does not proceed. The app icon on the home screen shows a "Waiting..." state. Only when the user manually force-quits the app does the installation begin.
Environment:
- iOS 26.7 (issue reproduces) vs iOS 18.7.2 (works correctly)
- Same .ipa build, same manifest.plist, same server
- App is enterprise-distributed (ad hoc / in-house signing)
- React Native 0.85.3 (but the JS code has not changed — same build on both devices)
- The manifest.plist and .ipa are served over HTTPS with valid certificates
Questions:
- Is this an intentional behavior change in iOS 26? If so, is there documentation?
- What is the recommended approach for triggering an OTA update from within the app that is being updated on iOS 26?
- Is there a supported API to programmatically background/suspend the app after opening the itms-services URL to allow the installation to proceed?