find . -type f ( -name '.storyboard' -o -name '.xib' ) -print0 \ | xargs -0 grep -nHE 'symbolName="[^"]+"|systemName="[^"]+"|image="[^"]+"|systemItem="[^"]+"'

find .
-type d ( -name Pods -o -name Carthage -o -name .build -o -name build -o -name DerivedData -o -name .git ) -prune -o
-type f -name '.swift' -print0
| xargs -0 grep -nHE
-e '\bUIButton.Configuration\b'
-e '\bconfiguration\s
='
-e '\bconfig.(image|title|imagePlacement|imagePadding|contentInsets)\s*='

iOSアプリにおけるSceneDelegate対応の調査 Qiita記事のポイント

Sceneベースのライフサイクルを採用していないアプリは起動しない – WWDC 2025のUIKitセッションでは、従来のUIApplication依存APIが非推奨となり、今後はsceneベースのライフサイクルを必須とする方針が発表された qiita.com 。iOS 26では単なる警告ログが出るが、次のメジャーリリース(iOS 27予定)からはScene Delegateを採用していないアプリが起動しなくなるという破壊的変更である qiita.com 。

Info.plistでApplication Scene Manifestを追加 – Info.plistにUIApplicationSceneManifestキーを追加し、UISceneConfigurationName、UISceneDelegateClassName、UISceneStoryboardFileなどを定義する qiita.com 。これによりアプリがシーンを認識し、scene delegateのクラスが読み込まれる。

ライフサイクルメソッドの移行 – AppDelegateにあったapplicationDidBecomeActive、applicationWillResignActive、applicationDidEnterBackground、applicationWillEnterForegroundといったメソッドは、SceneDelegateのsceneDidBecomeActive、sceneWillResignActive、sceneDidEnterBackground、sceneWillEnterForegroundに移行する qiita.com 。

古いAPIの置き換え – UIAlertViewはiOS 9.0で非推奨となっていたが、App Delegateではまだ使用できた。scene移行に伴いUIAlertControllerに置き換えなければクラッシュする事例があった qiita.com 。

移行完了の確認 – アプリ起動時に「This process does not adopt UIScene lifecycle」「UIScene lifecycle will soon be required」といったログが出なくなれば移行完了と判断できる qiita.com 。

WWDC 2025 UIKitセッションの内容

WWDC 2025のUIKitセッション「UIKitの新機能」では、Scene Delegateの必須化について明確に触れられている。特に21:57付近のスライドでは次の点が強調されていた:

Scenesは柔軟なアプリの基盤 – シーンはアプリのユーザーインターフェースを管理する単位であり、複数ウィンドウやマルチタスクに対応できる柔軟性を提供する。従来のUIApplication中心のAPIは非推奨となりつつある developer.apple.com 。

iOS 26以降はUISceneライフサイクルが必須 – スライドでは「UIScene life cycle will be required after iOS 26」と明言されており、最新SDKでビルドしたUIKitアプリではscene delegate採用が必須になることが示された developer.apple.com 。

Apple Technical Note TN3187の概要

Appleのテクニカルノート TN3187「Migrating to the UIKit scene‑based life cycle」は、sceneライフサイクルへの移行手順と理由を詳しく解説している。

必須化の背景とタイムライン

iOS 18.4/iPadOS 18.4/Mac Catalyst 18.4/tvOS 18.4/visionOS 2.4では、sceneを採用していないアプリで次のログが出力される:「This process does not adopt UIScene lifecycle. This will become an assert in a future version」 developer.apple.com 。

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」に更新され、近い将来の断言(app assertion)を予告している developer.apple.com 。

iOS 26の次のメジャーリリースでは、最新SDKでビルドしたアプリがscene life‑cycleを採用していなければ起動しない。複数シーンのサポートは必須ではないものの、sceneライフサイクル自体の導入は必須と明言されている developer.apple.com 。

Sceneの概念とライフサイクル

SceneはアプリのUIのインスタンスであり、ドキュメントベースのアプリでは各ドキュメントを独立したsceneとして表示できる developer.apple.com 。Sceneベースのライフサイクルはアプリ全体のライフサイクル(プロセスの起動など)と、UIが画面に表示されている期間のライフサイクルを分離する developer.apple.com 。

Sceneベースのライフサイクルを採用する最も簡単な方法は、Info.plistにUIApplicationSceneManifestキーを追加し、scene構成を定義すること developer.apple.com 。キーにはsceneの名称(UISceneConfigurationName)、delegateクラス名(UISceneDelegateClassName)、Storyboardファイル名などを設定する developer.apple.com 。

複数シーンをサポートすることは任意である。UIApplicationSupportsMultipleScenesキーをtrueにすると複数のシーンを同時に表示できるが、データモデルをsceneごとに分ける必要があるため慎重に検討する developer.apple.com 。

移行時の具体的な手順

Scene構成の追加 – Info.plistにUIApplicationSceneManifestを追加し、UISceneConfigurationNameやUISceneDelegateClassNameを設定する developer.apple.com 。

動的構成が必要な場合の実装 – application(_:configurationForConnecting:options:)メソッドをAppDelegateに実装して、ユーザーアクティビティに応じたUISceneConfigurationを返す developer.apple.com 。

ライフサイクルメソッドの移動 – UIApplicationDelegateのapplicationDidBecomeActive(_: )などのメソッドはUISceneDelegateの対応するメソッドに移行する developer.apple.com 。これにより、アプリの状態遷移をscene単位で処理できるようになる。

移行判断の指針

TN3187では、アプリが以下の条件に該当する場合はsceneベースライフサイクルへの移行が必要だと述べている:

Info.plistにUIApplicationSceneManifestキーがない、または構成が定義されていない developer.apple.com 。

AppDelegateにapplication(_:configurationForConnecting:options:)メソッドを実装していない developer.apple.com 。

まとめ

iOS 26以降はUISceneが必須 – WWDC 2025とTN3187の両方で、iOS 26の次のメジャーリリースではSceneベースライフサイクルを採用していないアプリが起動しなくなると明言されている developer.apple.com developer.apple.com 。既存アプリは早急に対応が必要である。

Info.plistへのSceneマニフェスト追加 – UIApplicationSceneManifestキーを追加し、scene構成(名前・delegateクラス名・Storyboardなど)を定義することでsceneサポートが有効になる developer.apple.com 。複数シーンのサポートは任意だが、シーンライフサイクル自体は必須である developer.apple.com 。

AppDelegateからSceneDelegateへのライフサイクル移行 – applicationDidBecomeActiveなどのメソッドはsceneDidBecomeActiveなどに移行し、UIAlertViewのような古いAPIはUIAlertControllerに置き換える必要がある qiita.com 。

動的シーン構成 – 特定のユーザーアクティビティに応じて異なるシーンを生成する場合は、application(_:configurationForConnecting:options:)を実装してUISceneConfigurationを返す developer.apple.com 。

これらの手順を踏むことで、今後のiOSリリースにおいてアプリが起動しなくなることを防ぎ、UIKitの最新機能を利用した柔軟なアプリケーション設計が可能になる。

プッシュ通知処理はSceneDelegateに移行する必要があるか? Apple公式ドキュメントにおける位置付け

UIApplicationDelegateの概要には、App Delegateはアプリの共有挙動を管理し、アプリの起動時に必要なサービスを登録する責任があると記されています。例として「Apple Push Notification service などのサービスへの登録」が挙げられており developer.apple.com 、プッシュ通知に関する処理が依然としてApp Delegateの役割であることがわかります。

UNUserNotificationCenterDelegateの概要では、通知の選択アクションを処理するために実装したデリゲートオブジェクトは、アプリが起動を完了する前に共有の UNUserNotificationCenter に登録する必要があると明示されています。具体的には、iOSアプリの場合は application(:willFinishLaunchingWithOptions:) または application(:didFinishLaunchingWithOptions:) メソッド内でデリゲートを設定するよう説明されています developer.apple.com 。Scene Delegateのメソッドは例示されておらず、App Delegateで設定することが推奨されています。

UIKITにおけるScene対応とプッシュ通知の関係

iOS 26以降では、Sceneベースのライフサイクルが必須となり、UISceneDelegateを導入しなければアプリが起動しないことがAppleのテクニカルノートTN3187などで示されています。しかし、この変更はアプリの起動とUI管理の仕組みに関するものであり、APNs(Apple Push Notification service)自体のフローは変わりません。

Courier社がiOS 26のScene強制化についてまとめた記事では、「プッシュ通知の基本は変わらない。デバイスのトークン取得やAPNsからのコールバックは引き続きAppDelegateに実装する」と明記しています courier.com courier.com 。また、Scene対応によってアプリが正しく起動しないとプッシュ通知の登録が行われないため、Scene Delegateを追加する必要はあるが、APNsコールバックの場所は変わらないとしています courier.com 。

Scene Delegateを採用しているアプリでも、プッシュ通知に反応して特定の画面へ遷移したい場合は、AppDelegateで受け取った通知コールバックからSceneDelegateのwindowやルートビューコントローラを参照してUIを更新するという形になります。iOS 13以降を対象としたチュートリアルでは「通知タップ時に呼び出されるメソッドは依然としてApp Delegateに存在する」と説明し、UIの変更にはUIApplication.shared.connectedScenes.first?.delegateでScene Delegateのwindowにアクセスする方法を紹介しています fluffy.es 。

Swift Rivalsの移行ガイドでは、application(_:didReceiveRemoteNotification:fetchCompletionHandler:)に対するScene Delegateの直接の代替は存在せず、プッシュ通知処理はアプリ全体の責務としてApp Delegateに実装すると述べています swiftrivals.com 。Scene固有の通知を処理したい場合は、Scene Delegate内でUI更新を行うことは可能ですが、通知自体の受信はApp Delegateで行います。

まとめと推奨

Scene Delegateへの移行はUIとライフサイクル管理に関するものであり、プッシュ通知の受信やデバイス登録の処理をScene Delegateに移動する必要はありません。

Apple公式ドキュメントでは、UNUserNotificationCenterのデリゲート設定やApple Push Notification serviceへの登録をApp Delegateの起動時メソッド内で行うことを推奨しています developer.apple.com developer.apple.com 。

iOS 26以降も、プッシュ通知のコールバックメソッド(例えばapplication(:didRegisterForRemoteNotificationsWithDeviceToken:)やapplication(:didReceiveRemoteNotification:fetchCompletionHandler:))はUIApplicationDelegateの一部であり、Scene Delegateに対応するメソッドはありません swiftrivals.com 。

Sceneベースライフサイクルを採用したプロジェクトでは、App Delegateで受け取った通知を使ってUIを更新する際に、UIApplication.shared.connectedScenesから目的のScene Delegateインスタンスを取得してそのwindowやルートビューコントローラにアクセスする方法が推奨されています fluffy.es 。

したがって、プッシュ通知処理をApp DelegateからScene Delegateへ完全に移行する必要はなく、App Delegateに残したままScene Delegateと連携する形で対応するのが適切です。