SceneDelegate 和 AppDelegate 的区别

Difference between SceneDelegate and AppDelegate

在我的 SwiftUI 项目中,我看到 AppDelegate 文件以及 SceneDelegate 文件。

它们有什么区别?

例如 SceneDelegate

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

并在 AppDelegate

application(_:didFinishLaunchingWithOptions:)

这两个文件的目的是根据 运行 整个应用程序所需的工作以及 "instance" 明显支持 运行ning 的应用程序所需的工作在后台。这就像配置一次数据库,但通过 window.

显示不同的值集

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

Multi-window support is happening

Next time you create a new Xcode project you’ll see your AppDelegate has split in two: AppDelegate.swift and SceneDelegate.swift. This is a result of the new multi-window support that landed with iPadOS, and effectively splits the work of the app delegate in two.

From iOS 13 onwards, your app delegate should:

  1. Set up any data that you need for the duration of the app.
  2. Respond to any events that focus on the app, such as a file being shared with you.
  3. Register for external services, such as push notifications.
  4. Configure your initial scenes.

In contrast, scene delegates are there to handle one instance of your app’s user interface. So, if the user has created two windows showing your app, you have two scenes, both backed by the same app delegate.

Keep in mind that these scenes are designed to work independently from each other. So, your application no longer moves to the background, but instead individual scenes do – the user might move one to the background while keeping another open.

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

多平台

除了 Abandoned Cart 的答案之外,自 Xcode 11 起,您有一个名为 Multiplatform 的新选项用于选择作为起始模板。在那里你只会看到一个文件包含:

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

这就是系统如何知道使用 @main(在 Swift 5.3 中)开始代码的方式,它包含管理多个 windows 应用程序的 WindowGroup在所有苹果平台。因此,您无需再担心 SceneDelegate 和 AppDelegate。

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

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

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

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

application(_:didFinishLaunchingWithOptions:) 在启动应用程序和完成应用程序设置时调用。更早的iOS13,我们可能使用过这个方法来配置UIWindow对象,并为UIWindow对象分配一个ViewController实例,使其显示在屏幕上。从iOS13开始,如果你的应用有场景,那么AppDelegate就不再负责处理这个了,移到了SceneDelegate。

发件人:https://medium.com/@kalyan.parise/understanding-scene-delegate-app-delegate-7503d48c5445