# iOS 26以降に必須となるSceneDelegateへの移行手順
iOS 26の次のメジャーリリース以降、UISceneライフサイクルを採用していないアプリは起動しなくなる。 移行の中心は、Info.plistへのScene Manifestの追加と、ライフサイクルメソッドのSceneDelegateへの移動である。
この記事は、Qiitaの記事、WWDC 2025のUIKitセッション、Apple Technical Note TN3187の内容を整理したものである。
# iOS 27以降は最新SDKでビルドしたアプリが起動しなくなる
OSのバージョンごとの動作は次のとおりである。
| OSバージョン | 動作 |
|---|---|
| iOS 18.4 / iPadOS 18.4 / Mac Catalyst 18.4 / tvOS 18.4 / visionOS 2.4 | 警告ログ This process does not adopt UIScene lifecycle. This will become an assert in a future version |
| iOS 26 / iPadOS 26 / Mac Catalyst 26 / tvOS 26 / visionOS 26 | 警告ログ UIScene lifecycle will soon be required. Failure to adopt will result in an assert in the future |
| iOS 26の次のメジャーリリース(iOS 27予定) | 最新SDKでビルドしたアプリは、sceneライフサイクル未採用だと起動しない |
WWDC 2025のUIKitセッション「UIKitの新機能」では、21:57付近のスライドで次のように明言されている。 「UIScene life cycle will be required after iOS 26」 従来のUIApplication中心のAPIは非推奨になりつつある。
複数シーンのサポートは任意だが、シーンライフサイクル自体の導入は必須である。
筆者の考えでは、既存アプリは早めに対応する必要がある。
# Sceneはアプリ全体とUI表示のライフサイクルを分ける
SceneはアプリのUIのインスタンスである。 ドキュメントベースのアプリでは、各ドキュメントを独立したsceneとして表示できる。 複数ウィンドウやマルチタスクに対応するための基盤になる。
Sceneベースのライフサイクルは、2つのライフサイクルを分離する。 1つはプロセスの起動などアプリ全体のライフサイクル、もう1つはUIが画面に表示されている期間のライフサイクルである。
# Info.plistとAppDelegateの状態で移行の要否を判断する
TN3187では、次のいずれかに該当するアプリは移行が必要としている。
- Info.plistに
UIApplicationSceneManifestキーがない、または構成が定義されていない - AppDelegateに
application(_:configurationForConnecting:options:)を実装していない
# Info.plistにScene Manifestを追加する
Info.plistにUIApplicationSceneManifestキーを追加し、scene構成を定義する。
これが最も簡単な採用方法である。
アプリがシーンを認識し、scene delegateのクラスが読み込まれるようになる。
| キー | 設定する内容 |
|---|---|
UISceneConfigurationName | sceneの名称 |
UISceneDelegateClassName | delegateクラス名 |
UISceneStoryboardFile | Storyboardファイル名 |
UIApplicationSupportsMultipleScenesをtrueにすると、複数のシーンを同時に表示できる。
ただし、データモデルをsceneごとに分ける必要があるため、慎重に検討する。
# sceneを動的に選ぶ場合は configurationForConnecting を実装する
ユーザーアクティビティに応じて異なるシーンを生成する場合がある。
その場合は、AppDelegateにapplication(_:configurationForConnecting:options:)を実装する。
このメソッドでUISceneConfigurationを返す。
# AppDelegateの状態遷移メソッドをSceneDelegateへ移す
AppDelegateの状態遷移メソッドを、SceneDelegateの対応するメソッドに移す。 これにより、アプリの状態遷移をscene単位で処理できる。
| AppDelegate(移行前) | SceneDelegate(移行後) |
|---|---|
applicationDidBecomeActive | sceneDidBecomeActive |
applicationWillResignActive | sceneWillResignActive |
applicationDidEnterBackground | sceneDidEnterBackground |
applicationWillEnterForeground | sceneWillEnterForeground |
# UIAlertViewはUIAlertControllerへ置き換える
UIAlertViewはiOS 9.0で非推奨だが、App Delegateではまだ使用できていた。
scene移行後はUIAlertControllerに置き換えないと、クラッシュする事例がある。
# 起動時の警告ログが消えれば移行完了と判断できる
アプリ起動時に次のログが出なくなれば、移行完了と判断できる。
This process does not adopt UIScene lifecycleUIScene lifecycle will soon be required
# 整理に使った3つの資料
- Qiita記事(SceneDelegate対応)
- WWDC 2025「UIKitの新機能」
- TN3187: Migrating to the UIKit scene-based life cycle (opens new window)