iOS 27 stops apps that skip UIScene: the API changes to fix before September
Summary. The iOS 27 public beta reached testers on July 13, 2026, and the general release is expected in September 2026. One change in this cycle is different from the rest, because it is no longer a warning. Apple's UIKit documentation states it plainly: "Beginning in iOS 27, iPadOS 27, Mac Catalyst 27, tvOS 27, and visionOS 27, apps built with the latest SDK must adopt the scene-based life cycle or they fail to launch." That has been a console message since iOS 18.4 and a louder one in iOS 26. In iOS 27 it is an assert. Alongside it, On Demand Resources and NSBundleResourceRequest are deprecated in favour of Background Assets, the original MetricKit APIs are no longer recommended for new adoption, and Xcode 27 ships Swift 6.4 while requiring macOS Tahoe 26.4 or later. Budget one to three engineer-days for the UIScene work on a typical UIKit app, roughly $400 to $1,200 (about ₹35,000 to ₹1,05,000) of senior time. The trap is that this is triggered by the SDK you build with, not the OS your users run.
That last point decides your timeline. Your shipping binary is fine. The next build you cut with Xcode 27 is the one that will not start.
This guide is about the code, not the devices. If you are planning the device and fleet side of the rollout, our iOS 27 enterprise rollout plan and the public beta readiness checklist cover that ground. Here we are dealing with what breaks inside your app.
The UIScene mandate is the whole story
Everything else in this release is scheduling. This one is a launch failure.
Apple has been escalating this warning for two years. Starting in iOS 18.4, iPadOS 18.4, Mac Catalyst 18.4, tvOS 18.4 and visionOS 2.4, UIKit logged this for apps that had not migrated:
This process does not adopt UIScene lifecycle.
This will become an assert in a future version.
In iOS 26 the wording hardened:
UIScene lifecycle will soon be required.
Failure to adopt will result in an assert in the future.
In iOS 27 the future arrived. Apps built against the new SDK that have not adopted scenes are stopped at launch. This is not theoretical, and it is not limited to hand-written UIKit apps. An unmodified Expo SDK 56 blank TypeScript app, prebuilt for iOS and compiled with Xcode 27.0 beta (build 27A5194q), dies on launch with a runtime assert:
Application failed to launch: UIScene life cycle is required for apps built with this SDK.
See Technote TN3187 for more information on migration.
The Expo issue was filed on June 8, 2026, accepted by the maintainers, and labelled as upstream React Native work. If your cross-platform toolchain generates the native iOS project for you, you are exposed to this through your framework rather than your own code, and the fix arrives on your framework's schedule. That is the part worth acting on this month.
Do you need to migrate?
Apple's criteria are precise. Migrate if either of these is true:
- The
UIApplicationSceneManifestkey is missing from your information property list, or it has no specified configurations. - Your app delegate does not implement
application(_:configurationForConnecting:options:).
One command answers the first question:
plutil -extract UIApplicationSceneManifest raw -o - ios/YourApp/Info.plist
# UIApplicationSceneManifest: missing <- you need to migrate
If that prints "missing", your next Xcode 27 build will not launch. Run it today. It takes ten seconds and it is the single highest-value check in this article.
The fix
Add a UIApplicationSceneManifest key with a scene configuration to your information property list:
<key>UIApplicationSceneManifest</key>
<dict>
<key>UIApplicationSupportsMultipleScenes</key>
<false/>
<key>UISceneConfigurations</key>
<dict>
<key>UIWindowSceneSessionRoleApplication</key>
<array>
<dict>
<key>UISceneConfigurationName</key>
<string>Default Configuration</string>
<key>UISceneDelegateClassName</key>
<string>$(PRODUCT_MODULE_NAME).SceneDelegate</string>
<key>UISceneStoryboardFile</key>
<string>Main</string>
</dict>
</array>
</dict>
</dict>
If you build your root view controller in code rather than from a storyboard, implement scene(_:willConnectTo:options:) and move the window out of the app delegate:
import UIKit
class SceneDelegate: UIResponder, UIWindowSceneDelegate {
var window: UIWindow?
func scene(
_ scene: UIScene,
willConnectTo session: UISceneSession,
options connectionOptions: UIScene.ConnectionOptions
) {
guard let windowScene = scene as? UIWindowScene else { return }
window = UIWindow(windowScene: windowScene)
window?.rootViewController = YourRootViewController()
window?.makeKeyAndVisible()
}
}
Then move your life-cycle logic. Apple's mapping is one-to-one, and this table is the migration:
| UIApplicationDelegate method | UISceneDelegate replacement | What usually lives here |
|---|---|---|
applicationDidBecomeActive(_:) |
sceneDidBecomeActive(_:) |
Analytics session start, resuming timers and video |
applicationWillResignActive(_:) |
sceneWillResignActive(_:) |
Pausing playback, hiding sensitive UI before the app switcher |
applicationDidEnterBackground(_:) |
sceneDidEnterBackground(_:) |
Saving state, flushing caches, starting background tasks |
applicationWillEnterForeground(_:) |
sceneWillEnterForeground(_:) |
Refreshing stale data, re-checking auth tokens |
application(_:didFinishLaunchingWithOptions:) |
Stays on the app delegate | Process-level setup only, not window creation |
The last row is where teams get this wrong. The app delegate does not go away. The process still launches once and UIApplicationDelegate still handles it. What moves is anything that owns or touches the window, because life-cycle events now happen per scene rather than globally. If your didFinishLaunchingWithOptions creates a UIWindow, that code is the migration.
After migrating, test in Full Screen Apps, Windowed Apps, and Stage Manager on iPad. Scenes can background independently, so state-saving code that assumed one global background event now runs per scene.
The deprecations that are real, and the ones being overstated
Apple's iOS and iPadOS 27 beta 3 release notes are the source of record here. Several round-ups have inflated what they say, so this table tracks Apple's own wording.
| Change in the iOS 27 SDK | Apple's wording | What to do |
|---|---|---|
On Demand Resources and NSBundleResourceRequest
|
"are deprecated. Use Background Assets instead." | Plan the move to Background Assets. This is a real deprecation |
Original MetricKit APIs (MXMetricManager, MXMetricManagerSubscriber, MXMetricPayload, MXDiagnosticPayload) |
"no longer recommended for new adoption. Use MetricManager instead." | Not deprecated. Do not rewrite working telemetry this quarter. Use MetricManager for new code |
| Neural Engine background access | The system "now restricts background access to the Neural Engine, similar to GPU usage restrictions" | Test any background on-device inference. This can change behaviour silently |
calendar.deleteEvents App Intents schema |
"has been renamed to calendar.deleteEvent." |
Rename it. A one-line fix that fails at runtime if missed |
PencilKit __PKStrokeRenderState
|
Renamed to PKStrokeRenderStateReference
|
Only affects apps touching stroke render state directly |
| AirPort Utility | No longer available for new downloads; "functionality is not guaranteed" on iOS 27 | Irrelevant to most teams, listed because round-ups misreport it as an API change |
The MetricKit row deserves the attention. Multiple write-ups say MXMetricManager is "deprecated" and imply you must migrate now. Apple's beta 3 notes say the original MetricKit APIs are "no longer recommended for new adoption" and point to MetricManager. Those are different statements with different urgency. Use the new API for new instrumentation. Leave working crash and metric pipelines alone until Apple actually deprecates them, because rewriting telemetry is how you lose the ability to debug the release you are shipping.
The Neural Engine restriction is the sleeper. If your app runs on-device inference from a background task, the system now throttles that access the way it throttles background GPU work. Nothing fails to compile. The behaviour just changes. Apps doing background photo classification, on-device transcription, or scheduled model work should test this before September rather than after.
Xcode 27: what it forces on your build machines
Xcode 27 beta 3 includes Swift 6.4 and the SDKs for iOS 27, iPadOS 27, tvOS 27, watchOS 27, macOS 27 and visionOS 27. Three constraints matter for a team rather than an individual:
- Xcode 27 beta 3 requires a Mac running macOS Tahoe 26.4 or later. Your CI fleet needs that before your developers do.
- On-device debugging supports iOS 17 and later, tvOS 17 and later, watchOS 10 and later, and visionOS. Older test devices in the drawer stop being useful for debugging.
- Build targets with a minimum deployment target of macOS 27.0 or DriverKit 27.0 no longer build Universal by default.
ARCHS_STANDARDdropsx86_64whenMACOSX_DEPLOYMENT_TARGETorDRIVERKIT_DEPLOYMENT_TARGETis 27.0 or higher. Addx86_64back toARCHSexplicitly if you still ship Intel Macs.
There is a known issue worth knowing before it eats a day: Address Sanitizer might fail to launch on iOS 27.0, tvOS 27.0, watchOS 27.0 and visionOS 27.0 when building with Xcode 26.4 or older. Apple's workaround is to use Xcode 26.5 or later when testing with Address Sanitizer.
The test pass to run before September
The release candidate is expected in early September, with general release around mid-September 2026. That gives most teams about eight weeks. Run this in order.
1. Answer the launch question first. Run the plutil command above on every app target you ship, including extensions and any white-label variants. This is a yes or no answer and it determines whether you have a project or a checklist.
2. Build against the iOS 27 SDK deliberately, in a branch. Do not wait for the September scramble. Cut a branch, point CI at Xcode 27, and let it fail now while failing is free.
3. Audit your cross-platform toolchain, not just your code. If you ship Expo, React Native, Flutter, or Unity, your native template is generated. Check whether your framework version emits UIApplicationSceneManifest, and track the upstream issue if it does not. This is the dependency most likely to be outside your control and on someone else's timeline.
4. Test background inference and background tasks on device. The Neural Engine restriction and scene-level backgrounding both change behaviour without changing your code. Simulators will not tell you the truth here.
5. Test the scene seams specifically. Multi-window on iPad, Stage Manager, and the app switcher. State restoration bugs from a UIScene migration surface when a second scene appears, which is exactly what your existing test suite never does.
6. Leave telemetry alone. Resist rewriting MetricKit during the same release you are migrating scenes. One structural change per release.
| Workstream | Typical effort | Risk if deferred past September |
|---|---|---|
| UIScene migration (UIKit app, single window) | 1 to 3 engineer-days | Critical. Apps built with the iOS 27 SDK fail to launch |
| Cross-platform template fix (Expo, RN, Unity) | Blocked on upstream, plus 0.5 day to integrate | Critical, and not on your schedule. Track it now |
| On Demand Resources to Background Assets | 2 to 5 engineer-days | Medium. Deprecated, not removed, but the migration is real work |
| Neural Engine background testing | 0.5 to 1 engineer-day | Medium. Silent behaviour change, no compile error |
| App Intents schema rename | Under 1 hour | Low, but it fails at runtime rather than at build |
| MetricKit migration | Do not start yet | None. It is a recommendation, not a deprecation |
For a single-window UIKit app with a storyboard, the UIScene migration is closer to a day than a week. The apps that hurt are the ones with multiple windows already faked through custom window management, heavy state restoration, or an app delegate that has quietly become the place where everything lives. The real cost is not the SceneDelegate. It is finding every line that assumed one window.
India-specific considerations
Two practical notes for teams shipping from or into India.
Test-device planning is the first. Xcode 27 drops on-device debugging below iOS 17, and Apple Intelligence features are limited to capable devices. If your QA pool leans on older iPhones, the useful test matrix for iOS 27 is narrower than your support matrix, and those are two different lists. Sort out which devices actually need to be in the September rotation before the rush.
The second is the September calendar. A mid-September iOS release lands directly on the festive commerce season, and a launch-week app update that fails to start is a materially worse outcome for a retail or fintech app in India than in most markets. Freeze early. If your app handles personal data, the same release is a reasonable moment to re-check what your SDKs collect under the Digital Personal Data Protection Act, 2023, since a scene migration is already making you read the code that runs at launch. We design applications aligned with DPDP requirements.
For teams on cross-platform stacks, our Flutter 3.44 production upgrade guide covers the parallel work on that side, and the Xcode 27 and Swift 6.4 feature notes go deeper on the toolchain. The iOS 27 App Intents and Siri developer guide covers the intent surface this release expands.
FAQ
Will my existing app stop working when users update to iOS 27?
No. The scene-based life cycle requirement binds apps built with the latest SDK, not apps running on the new OS. A binary compiled against an earlier SDK keeps launching on iOS 27. The failure appears the moment you rebuild with Xcode 27 and the iOS 27 SDK, which makes this a build-time deadline.
How do I know if my app needs the UIScene migration?
Apple gives two criteria. Migrate if the UIApplicationSceneManifest key is missing from your information property list or has no configurations, or if your app delegate does not implement application(_:configurationForConnecting:options:). Run plutil -extract UIApplicationSceneManifest raw -o - Info.plist against your target. If it prints missing, you need to migrate.
Does the app delegate go away in the scene-based life cycle?
No. Your app process still launches once and UIApplicationDelegate still handles it. What moves is anything owning visible UI, because life-cycle events now happen per scene rather than globally. Keep process-level setup in didFinishLaunchingWithOptions, and move window creation and active or background handling to your scene delegate.
Is MXMetricManager deprecated in iOS 27?
Not according to Apple. The iOS 27 beta 3 notes say the original MetricKit APIs, including MXMetricManager and MXMetricManagerSubscriber, are "no longer recommended for new adoption" and point to MetricManager instead. Several round-ups report this as a deprecation. Use the new API for new code and leave working pipelines alone.
What happened to On Demand Resources?
On Demand Resources and the NSBundleResourceRequest API are deprecated in the iOS 27 SDK, and Apple directs developers to Background Assets instead. Unlike the MetricKit change, this is a real deprecation in Apple's own wording. Plan the migration, but it does not block your September release.
Does this affect Expo, React Native, Flutter or Unity apps?
Yes, through the generated native project rather than your own code. An unmodified Expo SDK 56 app built with Xcode 27 beta fails to launch because its template omits UIApplicationSceneManifest. The issue was accepted on June 8, 2026 and labelled upstream React Native work. Check your framework version and track its fix.
What does Xcode 27 require from our build machines?
Xcode 27 beta 3 requires a Mac running macOS Tahoe 26.4 or later, and it includes Swift 6.4 with the iOS 27 SDK. On-device debugging supports iOS 17 and later only. Plan the CI upgrade before developers need it, because a stale build fleet blocks the whole team at once.
How long does the UIScene migration take?
We budget one to three engineer-days for a typical single-window UIKit app, roughly $400 to $1,200 as of July 2026. Cost rises with custom window management, heavy state restoration, and app delegates that accumulated unrelated logic. The SceneDelegate is quick. Finding every line that assumed one window is not.
How eCorpIT can help
eCorpIT runs iOS SDK migrations as scoped work with a deadline attached: the UIScene audit across every target and extension, the scene migration itself, background and multi-window testing on real devices, and the cross-platform template gaps that sit upstream of your code. Our senior engineering teams have shipped iOS applications since 2021 and plan this work around your release freeze rather than Apple's keynote. If you want your app checked against the iOS 27 SDK before the September release candidate, talk to our team.
References
- Transitioning to the UIKit scene-based life cycle - Apple Developer Documentation
- iOS and iPadOS 27 beta 3 release notes - Apple Developer Documentation
- Xcode 27 beta 3 release notes - Apple Developer Documentation
- Expo prebuild template fails to launch because UIScene lifecycle is required (issue 46664) - expo/expo
- Explore UIScene lifecycle requirements in iOS 27 (issue 71) - flutter_embed_unity
- iOS 27 public beta release date - 9to5Mac
- iOS 27 public beta is coming soon - MacRumors
- Apple iOS 27 release date: how to download the first iPhone public beta - Forbes
- OS 27 betas for all and everything else coming from Apple this month - Macworld
- iOS 27 - Wikipedia
- Things to prepare for breaking changes in iOS 27 and Xcode 27 - DevelopersIO
- UIKit's scene mandate: what fails to launch on iOS 27 - Blake Crosley
- Digital Personal Data Protection Act, 2023 - Ministry of Electronics and Information Technology, Government of India
- Digital Personal Data Protection Act, 2023 (No. 22 of 2023), official text - India Code
Last updated: July 16, 2026.
Top comments (0)