24 人が閲覧(直近 30 日) Flutter

Flutter UIScene移行手順|SceneDelegate対応と自動移行が効かない条件【2027年4月必須・Xcode 27】

Flutter UIScene移行手順|SceneDelegate対応と自動移行が効かない条件【2027年4月必須・Xcode 27】

Xcode 27(iOS 27 SDK)でビルドしたFlutterアプリは、UIScene ライフサイクルに移行していないと起動直後に落ちます。Apple は2027年4月から App Store への提出に iOS 27 SDK 以降を求めると告知しており、2027年4月以降に新規提出・更新するiOSアプリは、それぞれの提出までに移行が必要です。Flutter 側は 3.38 で API が入り、3.41 で自動移行が既定になりました。ただし自動移行は、AppDelegate がテンプレートのまま手を入れていないプロジェクトにしか効きません。

この記事では、Flutter のタグ付きソース(flutter_tools の移行処理)、公式移行ガイド(UIScene adoption)、Apple の告知と技術文書を根拠に、自動移行が効く条件、手動移行の手順、プラグインの対応版、移行後に出やすい不具合を整理します。Flutter 3.38 のほかの変更点は後半の1章にまとめました。最新版 Flutter の変更点はFlutter 3.47とは?material_ui移行・iOS 15と3.47.7までの修正【2026年10月時点】で扱っています。

まとめ:Flutter の UIScene 移行で押さえる要点

  • iOS 27 SDK でビルドしたアプリは、シーンベースのライフサイクルを採用していないと起動時に止まります。Apple は2026年9月9日の告知で、2027年4月から App Store Connect へのアップロードに iOS 27 SDK 以降を求めるとしました。
  • Flutter 3.38 で FlutterSceneDelegate などの移行用 API と、オプトインの自動移行(flutter config --enable-uiscene-migration)が入りました。3.41 から自動移行は既定で有効です。
  • 自動移行が動くのは、AppDelegate が過去の Flutter テンプレートのいずれかと(前後の空白を除いて)完全に一致し、Info.plist の UIMainStoryboardFile が Main の場合だけです。AppDelegate に1行でも足していれば手動移行になります。
  • 手動移行で必須なのは「AppDelegate を FlutterImplicitEngineDelegate に対応させる」「Info.plist に UIApplicationSceneManifest を足す」の2点で、SceneDelegate の自作は任意です。
  • Swift 6 でビルドしているなら、FlutterImplicitEngineDelegate への適合に @MainActor か @preconcurrency を付けないとビルドが通りません(issue #181033・2026年10月19日時点で未修正)。
  • 移行後はプッシュ通知・ディープリンク・認証まわりのプラグインを UIScene 対応版へ上げます。firebase_messaging は 16.7.0 で UIScene 下の APNs 登録漏れ、17.0.0 でコールドスタート時のリンク握りつぶしが直りました。

Xcode 27 で UIScene 未対応の Flutter アプリが起動しない理由と期限

発端は WWDC25 での Apple の告知です。Flutter 公式ガイドが引用している文言は「In the release following iOS 26, any UIKit app built with the latest SDK will be required to use the UIScene life cycle, otherwise it will not launch.」で、iOS 26 の次のリリース、つまり iOS 27 SDK が対象でした。Flutter アプリも iOS 側は UIKit の上で動くため、この要件から外れません。

移行で変わるのは AppDelegate の役割です。UI の状態(アクティブ化・バックグラウンド移行・URL の受け取りなど)は UISceneDelegate が受け持ち、AppDelegate はプロセス全体のイベントだけを扱います。移行後は applicationDidBecomeActive のような UI 状態のコールバックを UIKit が呼ばなくなります。iOS 27 SDK 全体の破壊的変更はiOS 27はいつ配信?日本時間2026年9月15日のリリースと27.0.1の修正・対応機種・SDK破壊的変更、UIKit 単体のアプリの書き方はUIKitとは?SwiftUIとの違いをコードで比較、iOS 27の変更点と併用の書き方にまとめています。

iOS のバージョンごとに変わる警告と起動失敗のメッセージ

Apple の技術文書 TN3187 によると、未移行アプリへの扱いは段階的に厳しくなっています。iOS 18.4 以降の端末で動かすとログに次の警告が出るようになり、iOS 26 で文言が変わりました。起動が止まるのは、iOS 27 SDK でビルドしたアプリを動かしたときです。

実行する iOS 未移行アプリの挙動
iOS 18.4〜18.x ログに警告(起動はする)
iOS 26 警告の文言が変わる(起動はする)
iOS 27 iOS 27 SDK でビルドしたアプリは起動時に停止
// iOS 18.4 以降
This process does not adopt UIScene lifecycle. This will become an assert in a future version.
// iOS 26
UIScene lifecycle will soon be required. Failure to adopt will result in an assert in the future.
// iOS 27 SDK でビルドしたとき(Xcode は EXC_BREAKPOINT で停止)
Application failed to launch: UIScene life cycle is required for apps built with this SDK. See Technote TN3187 for more information on migration.

最後の行は、Xcode 27 ベータで UIScene 未対応のアプリを起動したときのログとして expo/expo の issue #46663 に記録されているものです。ビルドもインストールも成功し、起動した瞬間に止まるので、CI のビルド成功だけでは検出できません。TN3187 が未移行とみなす条件は、Info.plist に UIApplicationSceneManifest が無いか構成が空であること、または AppDelegate がシーン構成のメソッドを実装していないことです。複数シーン対応までは求められておらず、要件はシーンベースのライフサイクルの採用だけです。

Flutter の CLI も独自に案内を出します。自動移行できなかったときは「To ensure your app continues to launch on upcoming iOS versions, UIScene lifecycle support will soon be required.」という警告が出ます。3.47 以降は、端末ログに UIScene life cycle is required が出ると flutter run が「Your iOS app has not been migrated to the UIScene lifecycle.」で始まる専用のエラーで止まります。

App Store の提出期限は2027年4月

Apple は2026年9月9日の Apple Developer News で「Starting April 2027, apps and games uploaded to App Store Connect need to meet the following minimum requirements」とし、iOS・iPadOS アプリは iOS 27・iPadOS 27 SDK 以降でビルドする必要があると告知しました。開始日は告知されておらず、Upcoming Requirements の SDK 要件は2026年10月19日時点で「2026年4月28日以降は Xcode 26 以降・iOS 26 SDK」のままです。

つまり、2027年4月以降にアプリの更新を出すには UIScene 移行が避けられません。それより前でも、開発機や CI の Xcode を 27 に上げた時点で手元のビルドは起動しなくなります。Xcode 27 のリリースノートは「Xcode 27 will only install and run on Apple silicon Macs.」としているため、Intel Mac のビルド機が残っている場合は機材の入れ替えも同じ時期に来ます(詳細はXcode 27はいつリリースされた?正式版27A266aの動作要件とXcode 26からの移行点)。一方、Xcode 26 以前でビルドして配布済みのアプリは、iOS 27 の端末でもそのまま起動します。

Flutter バージョン別の UIScene 対応状況

どの版から何ができるかは、flutter/flutter のタグ付きソースで確認できます。自動移行のフラグ(features.dart の uiSceneMigration)は 3.38.0 では available: true だけで、3.41.0 で enabledByDefault: true が付きました。2026年10月19日時点の安定版は 3.47.7(10月8日)です。

版 安定版リリース UIScene まわりの変化
3.38 2025-11-12 移行用 API 追加・自動移行はオプトイン
3.41 2026-02-11 自動移行が既定で有効・新規テンプレートに SceneDelegate
3.44 2026-05-18 UIScene の警告ログ検知と案内・未移行プラグインへの警告
3.47 2026-08-12 未移行で落ちたとき専用のエラーで停止

3.44 のリリースノートには、端末ログの UIScene 警告を検知して移行手順を案内する変更(PR #181515)と、未移行プラグインへの警告(PR #182826)が載っています。起動時のクラッシュを UIScene 未移行と特定して止めるのは 3.47 からで、ios/devices.dart の uiscene_crash インターセプタが担っています。

3.38 のまま Xcode 27 に上げる場合、自動移行は既定で無効なので、flutter config --enable-uiscene-migration で有効にするか 3.41 以降へ上げます。後で触れるプラグインの対応版の多くが Flutter 3.38 以上を要求するため、3.38 未満のプロジェクトは先に Flutter 本体を上げます。各版の変更全体はFlutter 3.41の変更点|Dart 3.11・UIScene既定化と3.41.9までの修正履歴とFlutter 3.44とは?SPM既定化とHCPPで変わる移行判断【2026年7月時点】を参照してください。

自動移行(flutter config --enable-uiscene-migration)の仕組みと効かない条件

自動移行の有効化と成功時の出力

3.38 では次のコマンドで機能を有効にしてから、flutter run か flutter build ios を実行します。3.41 以降は既定で有効なので、ビルドするだけで移行が走ります。環境変数 FLUTTER_UISCENE_MIGRATION=true でも有効化できますが、通常は flutter config で設定します。

flutter config --enable-uiscene-migration
flutter build ios

成功すると CLI が Finished migration to UIScene lifecycle. を出力し、AppDelegate と Info.plist が書き換わります。移行できなかった場合は前の章の「To ensure your app continues to launch…」の警告が出て、手動移行の案内になります。この警告が出たら、次の条件のどれかに当たっています。

自動移行がスキップされる条件

flutter_tools の migrations/uiscene_migration.dart(3.47.5 時点)は、次の順に判定して、1つでも外れると何もしません。

  • Info.plist が見つからない:警告を出して終了します。
  • Info.plist にすでに UIApplicationSceneManifest がある:中身を検証せずに「移行済み」とみなします。途中まで手で書いたマニフェストが壊れていても直しません。
  • UIMainStoryboardFile が Main でない:ストーリーボード名を変えたプロジェクトは対象外です。
  • AppDelegate がテンプレートと完全一致しない:Swift は過去の5種類のテンプレート、Objective-C は .h と .m の組と、前後の空白を除いて文字列比較します。MethodChannel の登録や Firebase の初期化を1行でも足していれば不一致です。

判定に使われるのは AppDelegate と Info.plist だけで、ほかのネイティブファイルの変更は影響しません。AppDelegate にプッシュ通知や SDK の初期化を書いている実務のアプリは、ほぼ手動移行になります。

手動移行の手順:AppDelegate・Info.plist・SceneDelegate

AppDelegate の FlutterImplicitEngineDelegate 対応

これまで application(_:didFinishLaunchingWithOptions:) で行っていたプラグイン登録を、新しいコールバック didInitializeImplicitFlutterEngine へ移します。シーンベースでは起動順が変わり、didFinishLaunching の時点ではまだ Flutter のビューが用意されていないためです。

import Flutter
import UIKit

@main
@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)
  }
}

上は自動移行が書き出す AppDelegate と同じ内容です。MethodChannel やプラットフォームビューを didFinishLaunching で作っていた場合も、同じコールバックへ移し、メッセンジャーは engineBridge.applicationRegistrar.messenger() から取ります。

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

  let batteryChannel = FlutterMethodChannel(
    name: "samples.flutter.dev/battery",
    binaryMessenger: engineBridge.applicationRegistrar.messenger()
  )
}

移行前によく書かれていた window?.rootViewController as! FlutterViewController は、didFinishLaunching 内で実行するとクラッシュする可能性があると公式ガイドが警告しています。

Info.plist への UIApplicationSceneManifest 追加

シーンの構成を Info.plist に宣言します。UISceneDelegateClassName に Flutter 標準の FlutterSceneDelegate を指定すれば、SceneDelegate を自作しなくても動きます。

<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>

UIApplicationSupportsMultipleScenes は false のままにします。公式ガイドは、Flutter が複数シーンをまだ完全にはサポートしておらず対応を進めている段階だと書いています。

SceneDelegate を自作する場合のクラス指定

シーンのイベントを自分で受けたいときは、FlutterSceneDelegate を継承したクラスを Runner フォルダに作ります。3.41 以降の新規テンプレートが生成するものと同じ形です。

import Flutter
import UIKit

class SceneDelegate: FlutterSceneDelegate {

}

Info.plist の UISceneDelegateClassName は、Swift なら $(PRODUCT_MODULE_NAME).SceneDelegate、Objective-C なら SceneDelegate に変えます。自動移行や手書きでは FlutterSceneDelegate のまま残りやすいので、SceneDelegate を作ったら差分レビューでこの値を確認してください。継承できない事情があるときは、FlutterSceneLifeCycleProvider プロトコルと FlutterPluginSceneLifeCycleDelegate でイベントを Flutter へ転送します。

AppDelegate のライフサイクル処理の移し先

AppDelegate に書いていた UI 状態の処理は、移行後は呼ばれません。公式ガイドの対応表のうち、実務で使う頻度が高いものは次のとおりです。

AppDelegate のメソッド 移し先(Scene 側)
applicationDidBecomeActive sceneDidBecomeActive
applicationWillResignActive sceneWillResignActive
applicationWillEnterForeground sceneWillEnterForeground
applicationDidEnterBackground sceneDidEnterBackground
application:openURL:options: scene:openURLContexts:
application:continueUserActivity:… scene:continueUserActivity:
application:performActionForShortcutItem:… windowScene:performActionForShortcutItem:…
application:didFinishLaunchingWithOptions: scene:willConnectToSession:options:

ホーム画面のクイックアクション(performActionForShortcutItem)は見落としやすい行です。起動時の情報も同じで、移行後は didFinishLaunchingWithOptions の launchOptions に通知やリンクが入らず、scene:willConnectToSession:options: の接続オプションへ届きます。ウィンドウや画面の取得も置き換え対象で、UIScreen mainScreen は UIWindowScene screen、UIApplication keyWindow は UIWindowScene keyWindow、UIApplication windows は UIWindowScene windows へ移します。

storyboard の FlutterViewController 初期化処理の移し先

プラットフォームチャネルの作成以外の目的で、didFinishLaunchingWithOptions の中で storyboard の FlutterViewController を取り出して設定しているアプリは、起動順の変化に合わせる必要があります。公式ガイドが示す移し先は2つで、FlutterViewController のサブクラスの awakeFromNib に処理を書くか、SceneDelegate の scene:willConnectToSession:options: に書くかです。

@objc class MyViewController: FlutterViewController {
  override func awakeFromNib() {
    super.awakeFromNib()
    doSomethingWithFlutterViewController(self)
  }
}

doSomethingWithFlutterViewController は公式ガイドの例にある仮の関数名で、ここに既存の初期化処理を移し、Main.storyboard のビューコントローラのクラスを MyViewController に変えます。

プラグインの UIScene 対応:作者の実装とアプリ側で上げる版

プラグイン作者の対応手順

アプリのライフサイクルや URL を受け取るプラグインは、プラグイン側の対応が要ります。次は既存プラグインの登録部分に加える差分の例で、import とイベント処理の実装は省いています。

public final class MyPlugin: NSObject, FlutterPlugin, FlutterSceneLifeCycleDelegate {
  public static func register(with registrar: FlutterPluginRegistrar) {
    let instance = MyPlugin()
    registrar.addApplicationDelegate(instance)
    registrar.addSceneDelegate(instance)
  }
}
  1. pubspec.yaml の下限を flutter: ">=3.38.0"(Dart は ^3.10.0)に上げる。
  2. プラグインクラスに FlutterSceneLifeCycleDelegate を採用し、addSceneDelegate で登録する。
  3. 使っていた AppDelegate のイベントに対応する Scene 側のメソッドだけを実装する。launch options に依存する処理は scene:willConnectToSession:options: へ移す。ただし、BGTaskScheduler の登録など起動完了前に必要な処理は、プラグインに公開メソッドを設け、アプリの AppDelegate から didFinishLaunchingWithOptions が戻る前に呼び出す。

addApplicationDelegate は残しておくのが公式の推奨です。利用側のアプリがまだ移行していない場合でも、従来どおり AppDelegate 経由でイベントを受け取れます。公式ガイドは、移行後は application:willFinishLaunchingWithOptions: と application:didFinishLaunchingWithOptions: の launch options が nil になると注意しています。launch options を読むプラグインはエラーを出さず、黙って何も受け取らなくなります。

アプリ側で確認する主要プラグインの対応版

アプリを移行したら、ライフサイクルに触るプラグインを UIScene 対応版へ更新します。対応開始版と最新版では必要なSDKが異なるため、更新先の下限も確認してください。例えば image_picker_ios 0.8.13+12 は Flutter 3.47/Dart 3.13、iOS 15以上を要求します。各パッケージの pub.dev の変更履歴で、UIScene 対応を最初に記載した版は次のとおりです(2026年10月19日確認)。

パッケージ UIScene 対応の版 10月19日時点の最新
app_links 7.0.0 7.2.2
firebase_messaging 16.1.0(修正は 16.7.0・17.0.0) 17.0.0
url_launcher_ios 6.4.0 6.4.2
local_auth_darwin 2.0.2 2.0.5
google_sign_in_ios 6.3.0 6.3.8
image_picker_ios 0.8.13+4 0.8.13+12
flutter_local_notifications 21.0.0(README とサンプル) 22.3.2

url_launcher_ios・local_auth_darwin・google_sign_in_ios・image_picker_ios の該当版は、どれも最小要件を Flutter 3.38/Dart 3.10 に上げています。app_links 7.0.0 は Flutter 3.38.1 と iOS 13 が最小です。flutter_local_notifications は 21.0.0 でプラグインの実装ではなく、サンプルアプリの UIScene 移行と、移行済みアプリに必要な設定の説明を README に足しています。通知の受け取り方を自前で書いているアプリは、README の手順と自分のコードを突き合わせてください。

add-to-app(既存ネイティブアプリへの組み込み)の移行

既存の iOS アプリに Flutter 画面を組み込んでいる場合、移行の主体はホストアプリです。ホストが UIScene に移行済みなら、SceneDelegate を FlutterSceneDelegate の継承に変えるだけで、Flutter のプラグインにシーンのイベント(openURL など)が届くようになります。継承は推奨であって必須ではありませんが、local_auth のようにシーンのコールバックを使うプラグインがあるなら、継承か FlutterSceneLifeCycleProvider による転送のどちらかでイベントを Flutter へ渡す必要があります。

SwiftUI でホストを書いている場合は、FlutterAppDelegate の application(_:configurationForConnecting:options:) で configuration.delegateClass = FlutterSceneDelegate.self を設定し、その UISceneConfiguration オブジェクトを返します。SwiftUI アプリは既定で複数シーンが有効なので、Info.plist の Enable Multiple Scenes を NO にするのを忘れないでください。

移行後に起きやすい不具合と確認方法

移行後にビルドが通っても、シーン経由のイベントに依存する機能はエラーを出さずに動かなくなることがあります。公開 issue と変更履歴で原因と対処を確かめられるものを挙げます。

Swift 6 の ConformanceIsolation エラーと適合指定による回避

Xcode のビルド設定で Swift Language Version を 6 にしていると、移行後の AppDelegate が次のエラーでビルドできません(issue #181033・2026年10月19日時点で open、修正 PR #184703 は未マージ)。

ConformanceIsolation (Xcode): Conformance of 'AppDelegate' to protocol 'FlutterImplicitEngineDelegate' crosses into main actor-isolated code and can cause data races

AppDelegate は UIResponder の子なのでメインアクターに隔離されていますが、FlutterImplicitEngineDelegate は隔離指定の無いプロトコルです。そのため Swift 6 のコンパイラは、プロトコルのメソッドが別スレッドから呼ばれうるとみなします。Flutter のコントリビューターは、Swift 6 対応が入るまでは Swift 6 へ上げないか、適合に @MainActor か @preconcurrency を付けるよう勧めています。

@main
@objc class AppDelegate: FlutterAppDelegate, @MainActor FlutterImplicitEngineDelegate {
  // 本体は変えない
}

同じ構造(メインアクター隔離の基底クラスを継承し、隔離指定の無い @objc プロトコルに適合する)の最小コードを Swift 6.3.3 の swiftc -swift-version 6 -typecheck にかけると、適合の書き方によって結果が分かれます。何も付けないと同じ [#ConformanceIsolation] エラーになり、@MainActor と @preconcurrency はどちらも通りました。-swift-version 5 では何も付けなくても通ります。Swift 5 のままならこの問題は起きないので、Swift 6 へ上げるのは UIScene 移行と分けて進めてください。

firebase_messaging の通知未達・通知タップ不具合と修正版

firebase_messaging は、UIScene 移行後の起動順の変化で不具合が続いたプラグインです。プラグイン登録が didInitializeImplicitFlutterEngine まで遅れるため、起動直後の通知を取りこぼすことがありました。変更履歴で直った版を確かめてから上げてください。

  • 16.7.0:UIScene のアプリでプラグインが起動時のコールバックを受け取れず、APNs への登録が行われない問題を修正(#18620)。16.5.0 で APNs トークンが取れなくなった退行(issue #18555)は、この修正で閉じられました。
  • 17.0.0(2026年10月15日):scene willConnectToSession の戻り値を NO に直し、コールドスタート時のディープリンクがほかのプラグインに渡らない問題を修正(#18733)。バックグラウンドで起動したプッシュのタップを届ける修正(#18802)も入っています。

17.0.0 は Firebase iOS SDK 13 への更新を含む破壊的変更の版で、Android 側も minSdk 24 が必要です。版を上げるのに加えて、AppDelegate に1行だけ必要な処理があります。17.0.0 の README は、UIScene のアプリではプラグイン登録が didFinishLaunchingWithOptions より後になる一方、Apple は UNUserNotificationCenter.delegate をこのメソッドが戻る前に設定するよう求めているとして、super の前で次を呼ぶよう案内しています。

import firebase_messaging

override func application(
  _ application: UIApplication,
  didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?
) -> Bool {
  FLTFirebaseMessagingPlugin.configureNotificationCenterDelegate()
  return super.application(application, didFinishLaunchingWithOptions: launchOptions)
}

通知を再送するような独自の回避コードを AppDelegate に足すより、16.7.0 以上へ上げてこの呼び出しを入れ、コールドスタート起点の動作は 17.0.0 で確かめるのが手戻りの少ない順番です。

コールドスタート時のユニバーサルリンク

UIScene に移行したアプリが停止中にユニバーサルリンクから起動されると、リンクは scene(_:continue:) ではなく scene(_:willConnectTo:options:) に届きます。これは Apple の Universal Links の文書にある仕様です。

問題は Flutter の互換処理の側にあります。issue #179452 では、未移行のプラグインへ AppDelegate 経由でイベントを回すフォールバックが、起動中には働くのにコールドスタートでは働かないと報告されました。Flutter のコントリビューターはこれを修正すべき見落としと認めたうえで、フォールバックはベストエフォートで恒久的には提供しないとしています(2026年10月19日時点で open)。リンクを扱うプラグインは app_links 7.0.0 以上のような UIScene 対応版へ上げ、起動中と停止中の両方からリンクを踏んで確認してください。

状態復元・アクティブ化処理・シーン設定の確認

  • 状態の復元:issue #174402 で、UIScene 移行後は FlutterViewController の状態保存・復元メソッドを UIKit が呼ばなくなる点が指摘され、2025年10月3日にクローズされました。復元を使う場合は 3.38 以降で動作を確かめてください。
  • AppDelegate に残したアクティブ化処理:applicationDidBecomeActive で行っていたトークン更新や画面ロックは、エラーも出さずに呼ばれなくなります。移行前に AppDelegate を grep し、表の移し先へ移したかを照合してください。
  • 手書きの Info.plist:UIApplicationSceneManifest があると自動移行は中身を見ずにスキップします。UISceneDelegateClassName のクラス名とモジュール名を目視で確認してください。

どうしても今すぐ移行できない場合の逃げ道も公式にあります。CLI の警告を消すには pubspec.yaml の flutter: config: に enable-uiscene-migration: false を書き、UIScene を一時的に切るには Info.plist の Application Scene Manifest の先頭に _ を付けます。ただし後者は Xcode 27 でビルドすると起動しなくなる状態に戻すだけです。2027年4月の期限までに Xcode 26 でビルドを続ける間の暫定策にとどめてください。ネイティブ側のコードが多く移行の切り分けに手が回らない場合は、Flutter / React Native開発の支援も用意しています。

Flutter 3.38 の UIScene 以外の主な変更点

Flutter 3.38.0 は2025年11月12日に安定版となり、Dart 3.10 を同梱しています。3.38 系の最終パッチは 3.38.10(2026年2月11日・Dart 3.10.9)です。UIScene 以外で移行時に影響しやすい変更は次のとおりです。

領域 3.38 の変更
Dart 言語 ドット省略記法(dot shorthands)が既定で有効
Widget Previews VS Code・Android Studio 拡張に初期統合(実験的)
Web web_dev_config.yaml でホスト・ポート・証明書を指定
Android 16KB ページサイズ対応・Java 17 が最低要件
iOS の実機実行 Xcode 26 の devicectl でインストール・起動

ドット省略記法は、型が推論できる場面で MainAxisAlignment.center を .center と書ける機能です。devicectl 経由の実機起動で問題が出たときは、flutter config --no-enable-lldb-debugging で従来の方式に戻せます。Dart のビルドフック(Native Assets)はFlutterのビルドフック(Native Assets)とは?hook/build.dartの書き方とFFI連携【Dart 3.13】で解説しています。

よくある質問

Flutter の UIScene 対応とは何をすることですか?

iOS アプリの UI ライフサイクルを AppDelegate から SceneDelegate へ移す作業です。Flutter では AppDelegate を FlutterImplicitEngineDelegate に対応させ、Info.plist に UIApplicationSceneManifest を追加します。

flutter config --enable-uiscene-migration は今も必要ですか?

Flutter 3.38 で自動移行を使う場合は有効化が必要です。手動移行だけなら、このコマンドは不要です。3.41 以降は自動移行が既定で有効なので、flutter build ios か flutter run を実行するだけで、AppDelegate がテンプレートのままのプロジェクトは移行されます。

UIScene に移行しないとどうなりますか?

Xcode 27(iOS 27 SDK)でビルドすると起動直後に止まります。Xcode 26 でビルドしたアプリは iOS 27 の端末でも動きますが、Apple は2027年4月から App Store への提出に iOS 27 SDK 以降を求めると告知しているため、それ以降は移行しないと更新を出せません。

SceneDelegate は必ず自作する必要がありますか?

必須ではありません。Info.plist で FlutterSceneDelegate を指定すれば動きます。シーンのイベントを自分で処理したいときだけ、FlutterSceneDelegate を継承したクラスを作ります。

UIScene 移行の警告を消すにはどうすればよいですか?

pubspec.yaml の flutter: config: に enable-uiscene-migration: false を追加します。この設定は自動移行の機能そのものを無効にするため、警告と一緒に自動移行も止まります。移行の必要性は残ります。

関連記事

お気に入りに入れた記事の一覧

この記事は以下の記事からリンクされています

資料請求

今日のトレンド記事 直近 24 時間で、いつもより多く読まれている記事

  1. 2026.10.23 テックブログ Renta!不正アクセスでサービス停止:再開未定の現状と運営側の停止判断・証拠保全・段階的再開
  2. 2025.01.09 コラム アドレサブルCM(Addressable CM)とは?フジテレビで出る表示の意味・仕組みと視聴データの扱い
  3. 2026.07.09 テックブログ Muse Imageとは?Metaの画像生成AIの使い方・API料金(1枚0.01ドル)と日本での提供状況【2026年10月】
  4. 2025.12.10 コラム 今の50代は何世代?バブル世代・団塊ジュニア・氷河期の境目と特徴
  5. 2026.10.21 テックブログ ふるさとチョイス不正アクセスで445万件流出:パスワード変更・対象確認と再開時期(10月23日第2報まで)

RELATED POSTS 関連記事

目次