SceneDelegate 和 AppDelegate 的区别

问题描述 投票:0回答:3

在我的 SwiftUI 项目中,我看到

AppDelegate
文件以及
SceneDelegate
文件。

它们之间有什么区别?

例如

SceneDelegate

中的方法之间
scene(_:willConnectTo:options:)

并且在

AppDelegate

application(_:didFinishLaunchingWithOptions:)
swift swiftui uikit
3个回答
119
投票

这两个文件旨在根据运行整个应用程序所需的内容和支持在后台明显运行的一个“实例”所需的内容来划分工作。这就像配置数据库一次,但通过窗口显示不同的值集。

您可以将它们视为全局版本和私有版本。一种是共享的,另一种仅限于个人所有者。在某种程度上,它们正是您所期望的名字。

多窗口支持正在发生

下次创建新的 Xcode 项目时,您将看到 AppDelegate 分为两部分:AppDelegate.swift 和 SceneDelegate.swift。这是一个 iPadOS 推出的新多窗口支持的结果,以及 有效地将应用程序委托的工作一分为二。

从 iOS 13 开始,您的应用程序委托应该:

  1. 设置应用程序运行期间所需的任何数据。
  2. 响应与应用程序相关的任何事件,例如与您共享的文件。
  3. 注册外部服务,例如推送通知。
  4. 配置您的初始场景。

相比之下,场景代表负责处理您的一个实例 应用程序的用户界面。因此,如果用户创建了两个显示 您的应用程序有两个场景,都由同一个应用程序委托支持。

请记住,这些场景设计为独立于 彼此。因此,您的应用程序不再移至后台, 相反,单个场景会这样做——用户可能会将其中一个移动到 背景,同时保持另一个打开。

感谢 https://www.hackingwithswift.com/articles/193/whats-new-in-ios-13


10
投票

AppDelegate
负责处理应用程序级事件(如应用程序启动)、应用程序生命周期和设置。

SceneDelegate
负责处理屏幕上显示的内容(窗口或场景)并管理应用程序的显示方式。

scene(_:willConnectTo:options:)
是UISceneSession生命周期中调用的第一个方法。该方法将创建一个新的UIWindow,设置根视图控制器,并使该窗口成为要显示的关键窗口。

application(_:didFinishLaunchingWithOptions:)
在启动应用程序以及完成应用程序设置时调用。在早期的 iOS 13 中,我们可能已经使用此方法来配置 UIWindow 对象,并将 ViewController 实例分配给 UIWindow 对象以使其显示在屏幕上。从 iOS 13 开始,如果您的应用程序有场景,则 AppDelegate 不再负责处理此问题,而是移至 SceneDelegate。

来自:https://medium.com/@kalyan.parise/understanding-scene-delegate-app-delegate-7503d48c5445


2
投票

多平台

除了 Abandoned Cart 的答案之外,自 Xcode 11 以来,您还有一个名为

Multiplatform
的新选项用于选择作为起始模板。在那里你只会看到一个文件包含:

@main
struct MyMultiplatformApp: App {
    var body: some Scene {
        WindowGroup {
            ContentView()
        }
    }
}

这就是系统如何知道在哪里开始使用

@main
代码(在 Swift 5.3 中),并且它包含
WindowGroup
来管理所有 Apple 平台中应用程序的多个窗口。所以你不再需要担心 SceneDelegate 和 AppDelegate 了。

如果您需要它像旧的应用程序委托一样,例如当您想使用它的方法时,您应该订阅相应的通知使用

UIAppDelegateAdapter
包装器,如我在此处描述

© www.soinside.com 2019 - 2024. All rights reserved.