SceneDelegate和AppDelegate之间的区别

96
在我的SwiftUI项目中,我看到了AppDelegate文件以及一个SceneDelegate文件。
它们之间有什么区别?
例如,在SceneDelegate中的方法之间。
scene(_:willConnectTo:options:)

并且在 AppDelegate

application(_:didFinishLaunchingWithOptions:)

5
根据谈话内容,他们从以前的AppDelegate中提取了功能并进行了拆分。SceneDelegate专门负责管理活动窗口,包括显示视图。 - mginn
3个回答

118
这两个文件用于区分应用程序整体所需的内容和支持在后台可见运行的一个“实例”所需的内容。这类似于一次配置数据库,但通过窗口显示不同的值集。你可以把它们看作是全局版本和私有版本。其中一个是共享的,另一个只限于个人所有者。从某种程度上说,它们正是按名称所期望的。
引入了多窗口支持。下次创建新的Xcode项目时,你将看到你的AppDelegate已经被拆成了两部分:AppDelegate.swift和SceneDelegate.swift。这是iPadOS配备的新多窗口支持的结果,并有效地将应用代理的工作拆成了两部分。从iOS 13开始,您的应用程序委托应该:
1. 设置任何您需要在整个应用程序中使用的数据。 2. 响应任何聚焦于应用程序的事件,例如与您共享的文件。 3. 注册外部服务,例如推送通知。 4. 配置初始场景。
相比之下,场景代理用于处理应用程序用户界面的一个实例。因此,如果用户创建了两个显示应用程序的窗口,则您将拥有两个场景,都由相同的应用程序委托支持。请记住,这些场景设计为独立于彼此工作。彼此之间的应用程序不再移动到后台,而是单独的场景 - 用户可能将其中一个场景放到后台,同时保持另一个场景开启。

https://www.hackingwithswift.com/articles/193/whats-new-in-ios-13提供


1
如果我的应用只支持iPhone呢? - Mohammad Zaid Pathan
3
正如文章所说,iPadOS发布时只是添加了“支持结果”。 - Abandoned Cart
我非常好奇这是否会影响 iPhone 应用程序的设计。我可以想象一个游戏,其中有一个用于菜单的场景和另一个用于游戏玩法的场景。使用具有场景委托的不同窗口的另一个实用的用途可以是电子商务应用的结帐...或者我错过了什么?:D - lyzkov
1
@lyzkov 我认为“scenes”这个词可能让你感到困惑。这个更改将代码从需要与每个实例一起运行的应用程序委托中分离出来,而这些代码只应该在所有实例中运行一次。就是这么简单。 - Abandoned Cart
@AbandonedCart 能否帮忙看一下这个问题:https://stackoverflow.com/questions/61220084/navigate-to-main-app-after-successful-signup-should-i-use-scenedelegate?虽然不是你在评论中建议的同一组织,但我的问题相同。 - xiaolingxiao
显示剩余3条评论

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

多平台

除了放弃购物车的答案之外,自从Xcode 11以来,您有一个名为多平台的新选项可用作起始模板。在那里,您只会看到一个包含以下内容的文件:

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

这就是系统如何知道从哪里开始使用@main代码(在Swift 5.3中),它包含WindowGroup,可在所有Apple平台上管理应用程序的多个窗口。因此,您无需再担心SceneDelegate和AppDelegate了。
如果您需要它像旧的AppDelegate一样,例如当您想要使用其方法时,您应该订阅相应的通知或者使用UIAppDelegateAdapter包装器,正如我在这里描述的那样

你应该订阅相应的通知,或者像我在这里描述的那样使用 UIAppDelegateAdapter 包装器 @Ixx。链接 - Mojtaba Hosseini

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接