目录
一、AppDelegate和SceneDelegate的关系
5.何时使用AppDelegate和SceneDelegate
在iOS 13及之后的版本中,苹果引入了UIScene和UISceneDelegate,将应用程序的生命周期管理分成了多个场景(Scene),使得多窗口支持成为可能。SceneDelegate 和 AppDelegate 分别负责不同方面的应用程序生命周期和 UI 管理。
这篇博客主要介绍UISceneDelegate以及相关API的用法。
1.主要用于处理应用程序级别的事件,如应用程序启动、终止、进入前台和后台等。
2.在iOS 13之前,AppDelegate负责所有应用程序生命周期的管理
1.引入于iOS 13,用于管理单个窗口或场景的生命周期。
2.一个应用程序可以有多个SceneDelegate实例,每个实例对应一个窗口或场景
3.主要用于处理与UI相关的生命周期事件,例如场景的创建、进入前台、进入后台等
AppDelegate实例如下:
- import UIKit
-
- @UIApplicationMain
- class AppDelegate: UIResponder, UIApplicationDelegate {
-
- var window: UIWindow?
-
- // 应用程序启动时调用
- func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool {
- // 初始化代码
- return true
- }
-
- // 应用程序进入后台时调用
- func applicationDidEnterBackground(_ application: UIApplication) {
- // 保存数据或释放资源
- }
-
- // 应用程序进入前台时调用
- func applicationWillEnterForeground(_ application: UIApplication) {
- // 恢复数据或资源
- }
-
- // 更多方法...
- }
SceneDelegate实例如下:
- import UIKit
-
- class SceneDelegate: UIResponder, UIWindowSceneDelegate {
-
- var window: UIWindow?
-
- // 场景连接时调用
- func scene(_ scene: UIScene, willConnectTo session: UISceneSession, options connectionOptions: UIScene.ConnectionOptions) {
- guard let windowScene = (scene as? UIWindowScene) else { return }
- window = UIWindow(windowScene: windowScene)
- window?.rootViewController = ViewController() // 设置根视图控制器
- window?.makeKeyAndVisible()
- }
-
- // 场景进入前台时调用
- func sceneWillEnterForeground(_ scene: UIScene) {
- // 恢复数据或资源
- }
-
- // 场景进入后台时调用
- func sceneDidEnterBackground(_ scene: UIScene) {
- // 保存数据或释放资源
- }
-
- // 更多方法...
- }
要使SceneDelegate生效,需要在Info.plist中进行配置:
- <key>UIApplicationSceneManifestkey>
- <dict>
- <key>UIApplicationSupportsMultipleSceneskey>
- <true/>
- <key>UISceneConfigurationskey>
- <dict>
- <key>UIWindowSceneSessionRoleApplicationkey>
- <array>
- <dict>
- <key>UISceneConfigurationNamekey>
- <string>Default Configurationstring>
- <key>UISceneDelegateClassNamekey>
- <string>$(PRODUCT_MODULE_NAME).SceneDelegatestring>
- dict>
- array>
- dict>
- dict>
AppDelegate: application(_:didFinishLaunchingWithOptions:)
SceneDelegate: scene(_:willConnectTo:options:)
AppDelegate: applicationWillEnterForeground(_:)
SceneDelegate: sceneWillEnterForeground(_:)
AppDelegate: applicationDidEnterBackground(_:)
SceneDelegate: sceneDidEnterBackground(_:)
- 处理应用程序级别的事件,如推送通知的注册、处理快捷方式、全局状态保存等。
- 与应用程序生命周期无关的设置和初始化。
- 处理与单个UI场景相关的事件,如窗口管理、多任务处理等。
- 每个窗口或场景特定的UI状态管理。
通过引入`SceneDelegate`,苹果提供了更好的方式来管理iPad的多窗口支持,并且更清晰地分离了应用程序的生命周期事件和UI相关的生命周期事件。这有助于开发者更好地组织代码并支持复杂的应用程序功能。