Contents

Understanding the iOS SceneDelegate

With the introduction of iOS 13, Apple made significant changes to the app lifecycle architecture by introducing the SceneDelegate. This new component manages the lifecycle and UI of one instance of your app’s UI, allowing for more flexibility, especially in supporting multiple windows on iPadOS.

What is SceneDelegate?

The SceneDelegate is responsible for managing what’s known as a “scene” in iOS. A scene represents a single instance of your app’s user interface. In simpler terms, you can think of a scene as one “window” or view that the user interacts with. On iPadOS, for instance, users can open multiple instances of the same app, each managed by its own scene.

The Role of SceneDelegate

SceneDelegate handles specific lifecycle events within a scene. This includes:

  • Setting up and tearing down the UI of the scene.
  • Responding to changes in the scene’s lifecycle, such as when it becomes active, moves to the background, or is closed.
  • Managing scene-specific tasks such as handling URL sessions, user activities, or external display connections.

Key Methods in SceneDelegate

Here are some of the key methods you’ll implement in SceneDelegate:

scene(_:willConnectTo:options:)

This method is called when a new scene session is being created and associated with your app. It’s where you typically set up your initial view controller and attach it to the provided UIWindow.

1
2
3
4
5
6
7
func scene(_ scene: UIScene, willConnectTo session: UISceneSession, options connectionOptions: UIScene.ConnectionOptions) {
    guard let windowScene = (scene as? UIWindowScene) else { return }
    let window = UIWindow(windowScene: windowScene)
    window.rootViewController = ViewController() // Set your view controller here
    self.window = window
    window.makeKeyAndVisible()
}

sceneDidDisconnect(_:)

Called when a scene has been disconnected and is no longer being used to display your app’s UI.

1
2
3
func sceneDidDisconnect(_ scene: UIScene) {
    // Perform any necessary cleanup here.
}

sceneDidBecomeActive(_:)

Called when the scene has moved from an inactive state to an active state, indicating it is now running in the foreground and receiving events.

1
2
3
func sceneDidBecomeActive(_ scene: UIScene) {
    // Restart any tasks that were paused when the scene was inactive.
}

sceneWillResignActive(_:)

Called when the scene is about to move from an active state to an inactive state.

1
2
3
func sceneWillResignActive(_ scene: UIScene) {
    // Pause ongoing tasks, disable timers, etc.
}

sceneWillEnterForeground(_:)

Called as the scene transitions from the background to the foreground.

1
2
3
func sceneWillEnterForeground(_ scene: UIScene) {
    // Prepare UI for foreground.
}

sceneDidEnterBackground(_:)

Called as the scene moves to the background. Use this method to save data, release shared resources, and store enough scene-specific state information to restore the scene back to its current state.

1
2
3
func sceneDidEnterBackground(_ scene: UIScene) {
    // Save application data, release resources, etc.
}

SceneDelegate vs. AppDelegate: Understanding the Differences

While SceneDelegate handles UI and scene lifecycle, AppDelegate continues to manage application-level events, such as responding to push notifications, determining whether the app can rotate, and initializing the application. In applications that support multiple scenes, AppDelegate is responsible for managing shared resources used by all scenes.

They have distinct areas of responsibility:

Feature SceneDelegate AppDelegate
Responsibility Manages the lifecycles of individual scenes Manages the overall application state and configuration
Lifecycle Tied to the lifecycle of each scene Tied to the entire application’s lifecycle
Usage Typically used for multi-window or multi-scene apps Often used for single-window apps

Conclusion

SceneDelegate refines the way iOS apps handle multiple displays and multitasking by separating the UI lifecycle from the app lifecycle. This modular approach not only simplifies certain aspects of app development but also opens up new possibilities in app architecture, especially for complex applications and those targeting iPadOS. Understanding and effectively using SceneDelegate is essential for modern iOS developers aiming to fully leverage the capabilities of iOS 13 and later.