# 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 lifecycle
  • UIScene lifecycle will soon be required

# 整理に使った3つの資料