• iOS中的UIScene和UISceneDelegate


    目录

    ​​​​​​​前言

    一、AppDelegate和SceneDelegate的关系

    1.AppDelegate

    2.SceneDelegate

    3.info.plist配置

    4.生命周期方法对比

    1.应用启动

    2.进入前台

    3.进入后台

    5.何时使用AppDelegate和SceneDelegate

    1.AppDelegate

    2.SceneDelegate


    前言

            在iOS 13及之后的版本中,苹果引入了UISceneUISceneDelegate,将应用程序的生命周期管理分成了多个场景(Scene),使得多窗口支持成为可能。SceneDelegateAppDelegate 分别负责不同方面的应用程序生命周期和 UI 管理。

            这篇博客主要介绍UISceneDelegate以及相关API的用法。

    一、AppDelegate和SceneDelegate的关系

    1.AppDelegate

            1.主要用于处理应用程序级别的事件,如应用程序启动、终止、进入前台和后台等。

            2.在iOS 13之前,AppDelegate负责所有应用程序生命周期的管理

    2.SceneDelegate

            1.引入于iOS 13,用于管理单个窗口或场景的生命周期。

            2.一个应用程序可以有多个SceneDelegate实例,每个实例对应一个窗口或场景

            3.主要用于处理与UI相关的生命周期事件,例如场景的创建、进入前台、进入后台等

       AppDelegate实例如下:

    1. import UIKit
    2. @UIApplicationMain
    3. class AppDelegate: UIResponder, UIApplicationDelegate {
    4. var window: UIWindow?
    5. // 应用程序启动时调用
    6. func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool {
    7. // 初始化代码
    8. return true
    9. }
    10. // 应用程序进入后台时调用
    11. func applicationDidEnterBackground(_ application: UIApplication) {
    12. // 保存数据或释放资源
    13. }
    14. // 应用程序进入前台时调用
    15. func applicationWillEnterForeground(_ application: UIApplication) {
    16. // 恢复数据或资源
    17. }
    18. // 更多方法...
    19. }

       SceneDelegate实例如下:

    1. import UIKit
    2. class SceneDelegate: UIResponder, UIWindowSceneDelegate {
    3. var window: UIWindow?
    4. // 场景连接时调用
    5. func scene(_ scene: UIScene, willConnectTo session: UISceneSession, options connectionOptions: UIScene.ConnectionOptions) {
    6. guard let windowScene = (scene as? UIWindowScene) else { return }
    7. window = UIWindow(windowScene: windowScene)
    8. window?.rootViewController = ViewController() // 设置根视图控制器
    9. window?.makeKeyAndVisible()
    10. }
    11. // 场景进入前台时调用
    12. func sceneWillEnterForeground(_ scene: UIScene) {
    13. // 恢复数据或资源
    14. }
    15. // 场景进入后台时调用
    16. func sceneDidEnterBackground(_ scene: UIScene) {
    17. // 保存数据或释放资源
    18. }
    19. // 更多方法...
    20. }

    3.info.plist配置

            要使SceneDelegate生效,需要在Info.plist中进行配置:

    1. <key>UIApplicationSceneManifestkey>
    2. <dict>
    3.     <key>UIApplicationSupportsMultipleSceneskey>
    4.     <true/>
    5.     <key>UISceneConfigurationskey>
    6.     <dict>
    7.         <key>UIWindowSceneSessionRoleApplicationkey>
    8.         <array>
    9.             <dict>
    10.                 <key>UISceneConfigurationNamekey>
    11.                 <string>Default Configurationstring>
    12.                 <key>UISceneDelegateClassNamekey>
    13.                 <string>$(PRODUCT_MODULE_NAME).SceneDelegatestring>
    14.             dict>
    15.         array>
    16.     dict>
    17. dict>

    4.生命周期方法对比

    1.应用启动

            AppDelegate: application(_:didFinishLaunchingWithOptions:)
           SceneDelegate: scene(_:willConnectTo:options:)

    2.进入前台

            AppDelegate: applicationWillEnterForeground(_:)
              SceneDelegate: sceneWillEnterForeground(_:)

    3.进入后台

            AppDelegate: applicationDidEnterBackground(_:)
            SceneDelegate: sceneDidEnterBackground(_:)

    5.何时使用AppDelegate和SceneDelegate

    1.AppDelegate

     - 处理应用程序级别的事件,如推送通知的注册、处理快捷方式、全局状态保存等。
      - 与应用程序生命周期无关的设置和初始化。

    2.SceneDelegate

     - 处理与单个UI场景相关的事件,如窗口管理、多任务处理等。
      - 每个窗口或场景特定的UI状态管理。

    通过引入`SceneDelegate`,苹果提供了更好的方式来管理iPad的多窗口支持,并且更清晰地分离了应用程序的生命周期事件和UI相关的生命周期事件。这有助于开发者更好地组织代码并支持复杂的应用程序功能。

  • 相关阅读:
    智能运维应用之道,告别企业数字化转型危机
    adb如何做Android ui自动化(这一篇就够了)
    如何用小程序端进行测试?
    Arduino从零开始(0)——介绍与点亮LED
    kmp:831. KMP字符串
    idea 实用小技巧分享
    从一条河、一个村、一座市场,看长沙市雨花区非凡十年
    C++ partial_sort()排序函数用法详解(深入了解,一文学会)
    LeetCode
    Uni-App 蚂蚁森林
  • 原文地址:https://blog.csdn.net/ZCC361571217/article/details/139380811