# Flutter UIScene Migration: Fix Launch Crashes on Xcode 27

> Flutter UIScene migration: iOS apps built with Xcode 27 fail to launch without it. Which Flutter versions migrate, and manual fixes, checked Oct 21, 2026.

Canonical: https://app369.com/blog/flutter-uiscene-migration-xcode-27-app-wont-launch-2026/
Last updated: 2026-10-21

[![Simon Dziak](https://app369.com/.netlify/images?w=48&amp;h=48&amp;fm=webp&amp;q=100&amp;url=%2Fimages%2Fszymon.jpg) **Simon Dziak** Founder & developer, App369](https://app369.com/about/szymon-dziak/) [LinkedIn](https://www.linkedin.com/in/szymondziak/)

Published October 18, 2026 · Updated October 21, 2026•Facts last verified October 21, 2026•8 min

App369https://app369.com/blog/flutter-uiscene-migration-xcode-27-app-wont-launch-2026/

[← Back to Blog](https://app369.com/blog/)

## Key takeaways

- →Apple said at WWDC25 that in the release after iOS 26, UIKit apps built with the latest SDK must use the UIScene life cycle, or they won't launch. Xcode 27, with the iOS 27 SDK, was released on September 14, 2026.
- →Flutter's docs say Flutter iOS apps built with Xcode 27 that haven't adopted UIScene fail to launch on startup.
- →Flutter 3.38 added UIScene support. From Flutter 3.41 (February 11, 2026), it is the default, and the Flutter CLI migrates apps with an unmodified AppDelegate automatically when you build or run.
- →A custom AppDelegate needs manual changes: register plugins in didInitializeImplicitFlutterEngine instead of didFinishLaunchingWithOptions, and add an Application Scene Manifest that uses FlutterSceneDelegate to Info.plist.
- →Plugins that rely on app lifecycle events such as applicationDidBecomeActive have to move to scene events, because UIKit stops calling the UI-related AppDelegate methods after the migration.

Pricing an app? Try the free [app cost calculator](https://app369.com/tools/app-cost-calculator/) or get a range for your project in the [instant quote](https://app369.com/instant-quote/).

**If your Flutter iOS app fails to launch after you build it with Xcode 27, the first thing to check is whether it has adopted Apple’s UIScene lifecycle.** Flutter’s docs say Flutter apps built with Xcode 27 (the iOS 27 SDK) that haven’t adopted UIScene fail to launch on startup. From Flutter 3.41, the Flutter CLI migrates apps with an unmodified `AppDelegate` automatically. Apps with a custom `AppDelegate`, or on an older Flutter, need a few manual changes to `AppDelegate` and `Info.plist`.

The facts below come from Flutter’s UIScene page, Apple’s technote TN3187 and Apple’s release and requirements pages, as listed in the sources. I checked each one on October 21, 2026.

**Disclosure:** App369 is my studio. I build and fix Flutter apps on iOS and Android, and the last section mentions what I sell. Google and Apple don’t pay me for anything on this page.

## What changed, and when

| Date | What happened | Source |
| --- | --- | --- |
| June 2025 (WWDC25) | Apple announces that in the release after iOS 26, UIKit apps built with the latest SDK must use the UIScene life cycle, or they won’t launch | [Flutter docs](https://docs.flutter.dev/release/breaking-changes/uiscenedelegate), [Apple TN3187](https://developer.apple.com/documentation/technotes/tn3187-migrating-to-the-uikit-scene-based-life-cycle) |
| November 12, 2025 | Flutter 3.38 adds UIScene support, with an experimental automatic migration | [Flutter 3.38 post](https://flutter.dev/blog/whats-new-in-flutter-3-38), [release archive](https://storage.googleapis.com/flutter_infra_release/releases/releases_macos.json) |
| February 11, 2026 | Flutter 3.41: UIScene support is the default, and eligible apps are migrated automatically | [Flutter docs](https://docs.flutter.dev/release/breaking-changes/uiscenedelegate), [release archive](https://storage.googleapis.com/flutter_infra_release/releases/releases_macos.json) |
| April 28, 2026 | App Store Connect uploads must be built with Xcode 26 or later | [Apple upcoming requirements](https://developer.apple.com/news/upcoming-requirements/) |
| **September 14, 2026** | **Xcode 27 released. Flutter apps built with it that haven’t adopted UIScene fail to launch** | [Apple releases](https://developer.apple.com/news/releases/), [Flutter docs](https://docs.flutter.dev/release/breaking-changes/uiscenedelegate) |
| **April 2027** (Apple gives no day) | **App Store Connect uploads must be built with the iOS 27 SDK or later, so Xcode 27** | [Apple News, September 9, 2026](https://developer.apple.com/news/?id=k1mtkt1k) |

Apple’s upcoming requirements page still lists Xcode 26 as the current minimum for uploads, but Apple’s [September 9, 2026 news post](https://developer.apple.com/news/?id=k1mtkt1k) says that starting April 2027, iOS and iPadOS apps must be built with the iOS 27 and iPadOS 27 SDK or later. Apple gives the month, not a day. So Xcode 26 works until then, but from April 2027 you have to build with Xcode 27, and the app won’t launch on that build unless it has migrated to UIScene.

Apple’s technote says the requirement is to adopt the scene life cycle. Supporting multiple scenes is encouraged but not required.

## Step 1: let Flutter migrate it

If the app is on Flutter 3.41 or later and its `AppDelegate` hasn’t been customized, Flutter’s docs say the CLI migrates it when you run `flutter run` or `flutter build ios`. On success it prints `Finished migration to UIScene lifecycle`. If it can’t, it warns you and gives manual steps.

My advice: if the app is on an older Flutter, upgrade to the current stable first (Flutter’s release archive lists 3.47.7, dated October 8, 2026) and see whether the automatic migration covers it, before changing native code by hand.

## Step 2: migrate a custom AppDelegate by hand

These steps follow Flutter’s [UIScene page](https://docs.flutter.dev/release/breaking-changes/uiscenedelegate).

### Register plugins in the new callback

Plugins used to be registered in `application:didFinishLaunchingWithOptions:`. Now the `AppDelegate` conforms to `FlutterImplicitEngineDelegate` and registers them in `didInitializeImplicitFlutterEngine`:

```
@objc class AppDelegate: FlutterAppDelegate, FlutterImplicitEngineDelegate {
  override func application(
    _ application: UIApplication,
    didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?
  ) -> Bool {
    return super.application(application, didFinishLaunchingWithOptions: launchOptions)
  }

  func didInitializeImplicitFlutterEngine(_ engineBridge: FlutterImplicitEngineBridge) {
    GeneratedPluginRegistrant.register(with: engineBridge.pluginRegistry)
  }
}
```

If you created method channels or platform views in `didFinishLaunchingWithOptions`, move them into `didInitializeImplicitFlutterEngine` too, using `engineBridge.applicationRegistrar.messenger()` as the messenger. Flutter’s docs warn that accessing the `FlutterViewController` in `didFinishLaunchingWithOptions` might crash your app, and say to use the `FlutterImplicitEngineDelegate` protocol instead.

### Move UI lifecycle code to a scene delegate

After the migration, UIKit no longer calls the `AppDelegate` methods tied to UI state, such as `applicationDidBecomeActive`. If you used them, create a scene delegate and move that code to scene events. Flutter’s docs say your own scene delegate must subclass `FlutterSceneDelegate` or conform to `FlutterSceneLifeCycleProvider`.

Flutter’s page adds, in its plugin section, that after the migration the launch options passed to `didFinishLaunchingWithOptions` are `nil`, and that logic relying on them moves to `scene:willConnectToSession:options:`. My advice: look first at code that handles a notification or a URL the app was opened with.

### Add the scene manifest to Info.plist

Add this inside the top-level `<dict>` of `ios/Runner/Info.plist`, as shown on Flutter’s page:

```
<key>UIApplicationSceneManifest</key>
<dict>
  <key>UIApplicationSupportsMultipleScenes</key>
  <false/>
  <key>UISceneConfigurations</key>
  <dict>
    <key>UIWindowSceneSessionRoleApplication</key>
    <array>
      <dict>
        <key>UISceneClassName</key>
        <string>UIWindowScene</string>
        <key>UISceneDelegateClassName</key>
        <string>FlutterSceneDelegate</string>
        <key>UISceneConfigurationName</key>
        <string>flutter</string>
        <key>UISceneStoryboardFile</key>
        <string>Main</string>
      </dict>
    </array>
  </dict>
</dict>
```

If you made your own scene delegate subclass, Flutter’s page says to put its name in `UISceneDelegateClassName` instead of `FlutterSceneDelegate`: `$(PRODUCT_MODULE_NAME).SceneDelegate` for Swift projects, `SceneDelegate` for Objective-C.

## Plugins and add-to-app

- **Plugins:** Flutter’s page has a separate guide for plugins that use iOS application lifecycle events. My advice: update every plugin to its latest version, then test anything that reacts to the app opening, resuming or receiving a link, such as push notifications, deep links, sign-in and payments.
- **Add-to-app:** if Flutter is embedded in a native iOS app, Flutter’s page has its own section, including what to do if you can’t subclass `FlutterSceneDelegate`.

## What to test

This section is my advice, not Flutter’s or Apple’s.

1. **Build with Xcode 27 and launch on a device.** If it launches, open each screen once.
2. **Cold start from a push notification and from a deep link.** Launch options are `nil` after the migration, so these are the paths most likely to break.
3. **Background and foreground the app.** Check anything that used to run in `applicationDidBecomeActive` or `applicationWillResignActive`.
4. **Ship through TestFlight first.** Check the same paths on a build installed the way users get it.

For every other dated Apple, Google Play and Firebase requirement in 2026 and 2027, see [App Store and Google Play deadlines for 2026 and 2027](https://app369.com/blog/app-store-google-play-deadlines-2026-2027/).

## Need a hand?

If a Flutter iOS app won’t launch after building with Xcode 27, or broke after the UIScene migration, the [App Fix Ticket](https://app369.com/fixed-price/flutter-firebase-bug-fix/) covers it in two fixed-price steps. A $450 Diagnosis gives you the root cause with evidence and a fixed repair quote within 3 business days, credited toward the fix. If you go ahead, the $1,200 Fix takes 5 business days and comes as a pull request. If the iOS build itself fails, see [Flutter iOS build failed after an upgrade](https://app369.com/blog/flutter-ios-build-failed-after-upgrade-2026/), or [send me a short description](https://app369.com/contact/).

## **Want this done at a fixed price?**

Fixed scope, fixed price, paid upfront. The work happens in writing; no call needed.

- [**App Fix Ticket**from $450One reproducible bug in an existing mobile or web app, diagnosed and fixed.](https://app369.com/fixed-price/flutter-firebase-bug-fix/)

## **Frequently asked questions**

<dl>

<dt>**Why does my Flutter app crash on launch when built with Xcode 27?**</dt>
<dd>Flutter's UIScene page says Flutter apps built with Xcode 27 (iOS 27 SDK) that haven't adopted the UIScene lifecycle fail to launch on startup. Apple announced at WWDC25 that UIKit apps built with the SDK after iOS 26 must use the UIScene life cycle. The fix is the UIScene migration.</dd>

<dt>**Does Flutter migrate to UIScene automatically?**</dt>
<dd>From Flutter 3.41, yes, if your AppDelegate is unmodified. Run flutter run or flutter build ios, and Flutter's docs say the CLI prints "Finished migration to UIScene lifecycle" when it succeeds. With a custom AppDelegate, or on a Flutter version before 3.41, you migrate by hand.</dd>

<dt>**How do I migrate a Flutter app to UIScene by hand?**</dt>
<dd>Per Flutter's docs: make AppDelegate conform to FlutterImplicitEngineDelegate, move GeneratedPluginRegistrant registration and any method channels into didInitializeImplicitFlutterEngine, move UI lifecycle logic to a scene delegate, and add a UIApplicationSceneManifest to Info.plist with FlutterSceneDelegate as the delegate class.</dd>

<dt>**Do I have to upload with Xcode 27 now?**</dt>
<dd>Not yet, but soon. Since April 28, 2026 the minimum is Xcode 26 with an iOS 26 SDK. Apple's September 9, 2026 news post says that starting April 2027, iOS and iPadOS apps uploaded to App Store Connect must be built with the iOS 27 and iPadOS 27 SDK or later, which means Xcode 27. Apple gives the month, not a day. The crash happens as soon as you build with Xcode 27, so the migration has to be done before April 2027.</dd>

<dt>**Can I turn UIScene off temporarily?**</dt>
<dd>Flutter's docs say you can, by putting an underscore in front of Application Scene Manifest in Info.plist, and that the pubspec setting enable-uiscene-migration: false hides the CLI warning. In my view, both only make sense while you build with Xcode 26, because an app built with Xcode 27 without UIScene won't launch.</dd>

</dl>

## **Sources**

1. [Flutter docs, UIScene adoption (last updated September 14, 2026)](https://docs.flutter.dev/release/breaking-changes/uiscenedelegate)
2. [Apple Developer, TN3187: Migrating to the UIKit scene-based life cycle](https://developer.apple.com/documentation/technotes/tn3187-migrating-to-the-uikit-scene-based-life-cycle)
3. [Apple Developer, Upcoming requirements](https://developer.apple.com/news/upcoming-requirements/)
4. [Apple Developer News, App Store submissions now open for the latest OS releases (September 9, 2026: iOS 27 SDK required starting April 2027)](https://developer.apple.com/news/?id=k1mtkt1k)
5. [Apple Developer, Releases](https://developer.apple.com/news/releases/)
6. [Flutter blog, What's new in Flutter 3.38](https://flutter.dev/blog/whats-new-in-flutter-3-38)
7. [Flutter release archive (macOS)](https://storage.googleapis.com/flutter_infra_release/releases/releases_macos.json)

Tags

#flutter uiscene migration #flutter app crashes on launch xcode 27 #uiscene lifecycle required ios 27 #FlutterSceneDelegate #FlutterImplicitEngineDelegate #didInitializeImplicitFlutterEngine #UIApplicationSceneManifest flutter #enable-uiscene-migration #TN3187 flutter

Generated from app369.com . © 2026 App369. All rights reserved.

**Share:**

[Share on Twitter](https://twitter.com/intent/tweet?text=Flutter%20UIScene%20Migration%3A%20Fix%20Launch%20Crashes%20on%20Xcode%2027&amp;url=https%3A%2F%2Fapp369.com%2Fblog%2Fflutter-uiscene-migration-xcode-27-app-wont-launch-2026%2F) [Share on LinkedIn](https://www.linkedin.com/sharing/share-offsite/?url=https%3A%2F%2Fapp369.com%2Fblog%2Fflutter-uiscene-migration-xcode-27-app-wont-launch-2026%2F) [Share on Facebook](https://www.facebook.com/sharer/sharer.php?u=https%3A%2F%2Fapp369.com%2Fblog%2Fflutter-uiscene-migration-xcode-27-app-wont-launch-2026%2F)

## **Related Resources **

[ITMS-90725 SDK Version Issue: Fix in Flutter (Xcode 26)](https://app369.com/blog/itms-90725-sdk-version-issue-xcode-26-flutter-2026/) [Expo and Flutter Build Errors: 12 Fixes (2026)](https://app369.com/blog/expo-flutter-build-errors-fixes-2026/) [iOS 27 SDK Required April 2027: Xcode 27 Checklist](https://app369.com/blog/ios-27-sdk-requirement-april-2027-xcode-27-flutter/) [Flutter iOS Build Failed After an Upgrade? Fix CocoaPods and Xcode Errors (2026)](https://app369.com/blog/flutter-ios-build-failed-after-upgrade-2026/) [Play Billing Library 9: Migration Guide and 2027 Deadline](https://app369.com/blog/play-billing-library-9-migration-deadline-2027/) [Flutter Android Build Fails After AGP 9: The Fix](https://app369.com/blog/flutter-android-gradle-plugin-9-build-failed-fix-2026/)

## **Related guides **

[<h3>**Flutter iOS Build Failed After an Upgrade? Fix CocoaPods and Xcode Errors (2026)**</h3>Flutter iOS build failed after upgrading Flutter, FlutterFire or Xcode? How to read the real error, then fix CocoaPods, deployment target and plugin mismatches.**Read more **](https://app369.com/blog/flutter-ios-build-failed-after-upgrade-2026/) [<h3>**Google Play Requires Target API 36: The Android 16 Update**</h3>Target API level 36: since Aug 31, 2026 Google Play needs apps and updates to target Android 16. What changes and the Flutter versions, checked Oct 21, 2026.** Read more **](https://app369.com/blog/google-play-target-api-36-android-16-requirement-2026/) [<h3>**Flutter "Deleted Android v1 Embedding" Build Error: The Fix**</h3>Build failed due to use of deleted Android v1 embedding? Flutter 3.29 removed v1. The AndroidManifest and MainActivity fixes, from docs checked Oct 21, 2026.** Read more **](https://app369.com/blog/flutter-deleted-android-v1-embedding-build-failed-2026/)