Unterschied zwischen SceneDelegate und AppDelegate

73

In meinem SwiftUI-Projekt sehe ich sowohl eine AppDelegateDatei als auch eine SceneDelegateDatei.

Was sind die Unterschiede zwischen ihnen?

Zum Beispiel zwischen den Methoden in SceneDelegate

scene(_:willConnectTo:options:)

und in der AppDelegate

application(_:didFinishLaunchingWithOptions:)
SwiftiSwift
quelle
1
Den Gesprächen zufolge haben sie die Funktionalität von AppDelegate von früher übernommen und aufgeteilt. Das SceneDelegate ist speziell für die Verwaltung des aktiven Fensters einschließlich der Anzeige von Ansichten verantwortlich.
mginn
@Adrian Sieht so aus, als hätten
Abandoned Cart

Antworten:

90

Die beiden Dateien sollen die Arbeit nach dem aufteilen, was zum Ausführen der App als Ganzes benötigt wird, und nach dem, was für eine "Instanz" benötigt wird, die das sichtbare Ausführen im Hintergrund unterstützt. Dies wäre so etwas wie eine einmalige Konfiguration einer Datenbank, aber die Anzeige verschiedener Wertesätze pro Fenster.

Sie können sich diese als globale und private Versionen vorstellen. Einer wird geteilt und der andere ist auf den einzelnen Eigentümer beschränkt. In gewisser Weise sind sie genau das, was Sie von den Namen erwarten würden.

Unterstützung für mehrere Fenster findet statt

Wenn Sie das nächste Mal ein neues Xcode-Projekt erstellen, wird Ihr AppDelegate in zwei Teile geteilt: AppDelegate.swift und SceneDelegate.swift. Dies ist ein Ergebnis der neuen Unterstützung für mehrere Fenster, die mit iPadOS gelandet ist und die Arbeit des App-Delegierten effektiv in zwei Teile aufteilt.

Ab iOS 13 sollte Ihr App-Delegierter:

  1. Richten Sie alle Daten ein, die Sie für die Dauer der App benötigen.
  2. Reagieren Sie auf Ereignisse, die sich auf die App konzentrieren, z. B. auf eine Datei, die für Sie freigegeben wird.
  3. Registrieren Sie sich für externe Dienste wie Push-Benachrichtigungen.
  4. Konfigurieren Sie Ihre ersten Szenen.

Im Gegensatz dazu sind Szenendelegierte dazu da, eine Instanz der Benutzeroberfläche Ihrer App zu verwalten. Wenn der Benutzer zwei Fenster erstellt hat, in denen Ihre App angezeigt wird, haben Sie zwei Szenen, die beide von demselben App-Delegaten unterstützt werden.

Beachten Sie, dass diese Szenen so konzipiert sind, dass sie unabhängig voneinander funktionieren. Ihre Anwendung wird also nicht mehr in den Hintergrund verschoben, sondern in einzelne Szenen. Der Benutzer kann eine in den Hintergrund verschieben, während eine andere geöffnet bleibt.

Mit freundlicher Genehmigung von https://www.hackingwithswift.com/articles/193/whats-new-in-ios-13

Verlassener Wagen
quelle
1
Was ist, wenn meine App nur das iPhone unterstützt?
Mohammad Zaid Pathan
1
@ZaidPathan Wie der Artikel sagte, war es nur ein Ergebnis der Unterstützung, die mit der Veröffentlichung von iPadOS hinzugefügt wurde.
Verlassener Wagen
Ich bin sehr gespannt, ob sich dies auf das Design von iPhone-Anwendungen auswirken wird. Ich kann mir ein Spiel vorstellen, in dem es eine Szene für das Menü und eine andere Szene für das Gameplay gibt. Eine andere praktische Verwendung eines bestimmten Fensters mit Szenedelegate kann das Auschecken für E-Commerce-Apps sein ... Oder fehlt mir etwas? : D
lyzkov
@lyzkov Ich denke, das Wort "Szenen" hat Sie verwirrt. Diese Änderung trennt den Code von dem App-Delegaten, der mit jeder Instanz ausgeführt werden muss, von dem Code, der nur einmal für alle Instanzen ausgeführt werden sollte. So einfach ist das wirklich.
Verlassener Wagen
Wohin sollte die Benutzerauthentifizierungslogik gehen? Gemäß der Anweisung "Richten Sie alle Daten ein, die Sie für die Dauer der App benötigen" sollte die Authentifizierung in AppDelegate erfolgen. Die anfängliche App-Eintragslogik funktioniert jedoch nur, wenn sie sich in SceneDelegate.scene befindet. Daher muss ich auch in SceneDelegate auf den Benutzerauthentifizierungsstatus achten
xiaolingxiao
2

Multiplattform

Zusätzlich zur Antwort von Abandoned Cart , Seit Xcode 11, haben Sie eine neue Option Multiplatformzur Auswahl als Startvorlage. Dort sehen Sie nur eine Datei, die Folgendes enthält:

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

Auf diese Weise weiß das System, wo der Code beginnen soll @main(in Swift 5.3), und es enthält WindowGroupmehrere Fenster Ihrer App auf allen Apple-Plattformen. Sie müssen sich also keine Sorgen mehr um SceneDelegate und AppDelegate machen.

Wenn Sie möchten, dass es dem alten App-Delegaten entspricht, z. B. wenn Sie seine Methoden verwenden möchten, sollten Sie entsprechende Benachrichtigungen abonnieren oder den UIAppDelegateAdapterWrapper wie hier beschrieben verwenden

Mojtaba Hosseini
quelle
Sie sollten entsprechende Benachrichtigungen abonnieren oder den UIAppDelegateAdapterWrapper verwenden, wie ich hier beschrieben habe @Ixx
Mojtaba Hosseini