目录

理解 iOS 开发中的 SceneDelegate

随着 iOS 13 的推出,Apple 通过引入 SceneDelegate 对应用生命周期架构做出了重大更改。这个新组件管理应用 UI 的一个实例的生命周期和 UI,允许有更大的灵活性,尤其是在支持 iPadOS 上的多个窗口方面。

什么是 SceneDelegate?

SceneDelegate 负责管理 iOS 中所谓的“场景”。场景表示应用用户界面一个实例。用更简单的话来说,您可以将场景看作用户交互的一个“窗口”或视图。例如,在 iPadOS 上,用户可以打开同一应用的多个实例,每个实例都由自己的场景管理。

SceneDelegate 的作用

SceneDelegate 处理场景内的特定生命周期事件。这包括:

  • 设置和关闭场景的 UI。
  • 对场景生命周期中的更改做出响应,例如当场景变为活动,切换到后台或关闭时。
  • 管理特定场景的任务,如处理 URL 会话、用户活动或外部显示连接。

SceneDelegate 中的关键方法

以下是在 SceneDelegate 中实现的一些关键方法:

scene(_:willConnectTo:options:)

当创建新的场景会话并与你的应用关联时,会调用此方法。通常在这里设置初始视图控制器并将其附加到提供的 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() // 在这里设置你的视图控制器
    self.window = window
    window.makeKeyAndVisible()
}

sceneDidDisconnect(_:)

当场景断开连接且不再用于显示应用的UI时调用。

1
2
3
func sceneDidDisconnect(_ scene: UIScene) {
    // 在这里执行任何必要的清理工作。
}

sceneDidBecomeActive(_:)

当场景从非活动状态移动到活动状态时调用,表明它现在在前台运行并接收事件。

1
2
3
func sceneDidBecomeActive(_ scene: UIScene) {
    // 重新开始在场景不活跃时暂停的任何任务。
}

sceneWillResignActive(_:)

当场景即将从活跃状态移动到非活跃状态时调用。

1
2
3
func sceneWillResignActive(_ scene: UIScene) {
    // 暂停正在进行的任务,禁用计时器等。
}

sceneWillEnterForeground(_:)

当场景从后台过渡到前台时调用。

1
2
3
func sceneWillEnterForeground(_ scene: UIScene) {
    // 为前台准备UI。
}

sceneDidEnterBackground(_:)

当场景移动到后台时调用。使用此方法来保存数据,释放共享资源,并存储足够的场景特定状态信息以恢复场景回到当前状态。

1
2
3
func sceneDidEnterBackground(_ scene: UIScene) {
    // 保存应用数据,释放资源等。
}

SceneDelegate 与 AppDelegate:了解差异

SceneDelegate 处理 UI 和场景生命周期,AppDelegate 管理应用程序级事件,例如响应推送通知、确定应用是否可以旋转和初始化应用程序。在支持多个场景的应用程序中,AppDelegate 负责管理所有场景使用的共享资源。

它们有不同的职责范围:

功能 SceneDelegate AppDelegate
职责 管理各个场景的生命周期 管理应用程序的整体状态和配置
生命周期 与每个场景的生命周期相关 与整个应用程序的生命周期相关
用途 通常用于多窗口或多场景应用 通常用于单窗口应用

结论

SceneDelegate 通过将 UI 生命周期与应用生命周期分离,改进了 iOS 应用处理多显示器和多任务的方式。这种模块化方法不仅简化了应用开发的某些方面,还为应用架构开辟了新的可能性,尤其是对于复杂应用和针对 iPadOS 的应用。对于希望充分利用 iOS 13 及更高版本功能的 iOS 开发者来说,理解并有效使用 SceneDelegate 是至关重要的。