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实例如下:

Swift 复制代码
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实例如下:

Swift 复制代码
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) {
        // 保存数据或释放资源
    }
    
    // 更多方法...
}

3.info.plist配置

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

XML 复制代码
<key>UIApplicationSceneManifest</key>
<dict>
    <key>UIApplicationSupportsMultipleScenes</key>
    <true/>
    <key>UISceneConfigurations</key>
    <dict>
        <key>UIWindowSceneSessionRoleApplication</key>
        <array>
            <dict>
                <key>UISceneConfigurationName</key>
                <string>Default Configuration</string>
                <key>UISceneDelegateClassName</key>
                <string>$(PRODUCT_MODULE_NAME).SceneDelegate</string>
            </dict>
        </array>
    </dict>
</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相关的生命周期事件。这有助于开发者更好地组织代码并支持复杂的应用程序功能。

相关推荐
T1an-11 小时前
最右IOS岗一面
ios
坏小虎4 小时前
Expo 快速创建 Android/iOS 应用开发指南
android·ios·rn·expo
光影少年5 小时前
Android和iOS原生开发的基础知识对RN开发的重要性,RN打包发布时原生端需要做哪些配置?
android·前端·react native·react.js·ios
北京自在科技5 小时前
Find My 修复定位 BUG,AirTag 安全再升级
ios·findmy·airtag
Digitally6 小时前
如何不用 USB 线将 iPhone 照片传到电脑?
ios·电脑·iphone
Sim148018 小时前
iPhone将内置本地大模型,手机端AI实现0 token成本时代来临?
人工智能·ios·智能手机·iphone
Digitally20 小时前
如何将 iPad 上的照片传输到 U 盘(4 种解决方案)
ios·ipad
报错小能手1 天前
ios开发方向——swift并发进阶核心 @MainActor 与 DispatchQueue.main 解析
开发语言·ios·swift
LcGero1 天前
Cocos Creator 业务与原生通信详解
android·ios·cocos creator·游戏开发·jsb
ii_best1 天前
lua语言开发脚本基础、mql命令库开发、安卓/ios基础开发教程,按键精灵新手工具
android·ios·自动化·编辑器