こんにちは、ヤプリの三縞です。
Xcode 11 からはiOSプロジェクトを新規作成すると AppDelegate と同時に SceneDelegate も自動生成されます。
この記事ではこの SceneDelegate について、その役割や AppDelegate との違いについて調べたことを残しておきます。
SceneDelegateの役割
SceneDelegate によって、1つのアプリに対して複数のUIのインスタンスを作れるようになります。
今秋にリリースされるiPadOSでは Slide Over / Split View 機能で1画面の中に同じアプリを2つ並べることができるようになりますが、これはこの「1つのアプリに対して複数のUIのインスタンスを作れるように」なることで実現可能となります。
Xcode 11 からはiOSプロジェクトの新規作成時に自動で SceneDelegate が作成されることから、今後はiOSでも複数のUIインスタンスを利用した新しい機能が導入されるのではないかと思っています。
SceneDelegateの挙動
SceneDelegateは iOS 13 から導入されるprotocol UIWindowSceneDelegateに準拠するクラスSceneDelegateは 必須ではない- Info.plistの
Application Scene Manifest(キー名:UIApplicationSceneManifest) にSceneの設定があるときに必要となる
- Info.plistの
SceneDelegateがある場合・ない場合のどちらでもAppDelegateは必要@UIApplicationMainAttributeを用いてアプリのエントリーポイントとして指定するため
- 「ライフサイクルイベント」が発生したときは
SceneDelegateかAppDelegateのどちらかのメソッドしか呼ばれない- iOS 13 かつ
SceneDelegateが使用されている場合はSceneDelegateが - それ以外では
AppDelegateが
- iOS 13 かつ
- 「ライフサイクルイベント」とは以下のようなもの
- バックグラウンド・フォアグラウンドへの移動
- ResignActive・BecomeActive
- open URL
- NSUserActivity系
SceneDelegateがある場合・ない場合のどちらでも、アプリ全体に関わるイベントはAppDelegateのメソッドが呼ばれるapplication:didFinishLaunchingWithOptions:applicationWillTerminate:
SceneDelegateがある場合・ない場合のどちらでも、以下のような「ライフサイクルイベント」に関するNotificationは機能する
NotificationCenter.default.addObserver(forName: UIApplication.didEnterBackgroundNotification, object: nil, queue: nil) { _ in print("notification didEnterBackgroundNotification") }
確認環境
- Xcode 11 beta 5
- Swift 5.1