こんにちは、ヤプリの三縞です。
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
は必要@UIApplicationMain
Attributeを用いてアプリのエントリーポイントとして指定するため
- 「ライフサイクルイベント」が発生したときは
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