89

在我的 SwiftUI 项目中,我看到AppDelegate了文件和SceneDelegate文件。

它们之间有什么区别?

例如在方法之间SceneDelegate

scene(_:willConnectTo:options:)

并且在AppDelegate

application(_:didFinishLaunchingWithOptions:)
4

3 回答 3

111

这两个文件旨在根据运行整个应用程序所需的内容以及支持在后台明显运行的“实例”所需的内容来拆分工作。这类似于配置一次数据库,但按窗口显示不同的值集。

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

多窗口支持正在发生

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

从 iOS 13 开始,你的应用代理应该:

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

相反,场景委托用于处理应用程序用户界面的一个实例。因此,如果用户创建了两个显示您的应用程序的窗口,那么您就有了两个场景,它们都由同一个应用程序委托支持。

请记住,这些场景旨在彼此独立工作。因此,您的应用程序不再移动到后台,而是单独的场景移动 - 用户可能会将一个场景移动到背景,同时保持另一个场景打开。

礼貌https://www.hackingwithswift.com/articles/193/whats-new-in-ios-13

于 2019-06-07T16:43:55.207 回答
6

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

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

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

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

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

于 2022-01-04T19:35:09.857 回答
2

多平台

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

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

这就是系统知道从哪里开始代码的方式@main(在 Swift 5.3 中),它包含WindowGroup在所有苹果平台上管理应用程序的多个窗口。所以你不再需要担心 SceneDelegate 和 AppDelegate 了。

如果您需要它像旧的应用程序委托一样,例如当您想使用它的方法时,您应该订阅相应的通知使用我在此处描述UIAppDelegateAdapter的包装器

于 2020-07-09T11:41:14.133 回答