Yappli Tech Blog

株式会社ヤプリの開発メンバーによるブログです。最新の技術情報からチーム・働き方に関するテーマまで、日々の熱い想いを持って発信していきます。

iOS 13 から導入されるSceneDelegateとは

こんにちは、ヤプリの三縞です。

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の設定があるときに必要となる
  • SceneDelegate がある場合・ない場合のどちらでも AppDelegate は必要
    • @UIApplicationMain Attributeを用いてアプリのエントリーポイントとして指定するため
  • 「ライフサイクルイベント」が発生したときは SceneDelegateAppDelegate のどちらかのメソッドしか呼ばれない
    • iOS 13 かつ SceneDelegate が使用されている場合は SceneDelegate
    • それ以外では AppDelegate
  • 「ライフサイクルイベント」とは以下のようなもの
    • バックグラウンド・フォアグラウンドへの移動
    • 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

参考資料