Die Rolle von App-Delegierten und Szene-Delegierten in der iOS-Entwicklung verstehen

Seit den frühesten Versionen von iOS ist das UIApplicationDelegate-Protokoll das Rückgrat des iOS App-Lifecycle-Managements. Die Einführung der Multi-Window-Unterstützung in iOS 13 hat jedoch grundlegend verändert, wie Entwickler mit Benutzeroberflächen umgehen. Apple führte das UISceneDelegate-Protokoll ein, um app-weite Verantwortlichkeiten von der Verwaltung pro Fenster zu entkoppeln. Das Verständnis der genauen Rollen dieser beiden Delegierten ist für die Erstellung moderner, Multi-Window-iOS-Anwendungen unerlässlich - sei es für iPhones, iPads oder Mac Catalyst. Dieser Artikel bietet eine umfassende Untersuchung beider Delegierten, ihrer Lebenszyklusmethoden, wie sie interagieren und bewährte Verfahren für ihre effektive Nutzung.

Was ist ein App Delegate?

Das App Delegate ist der Einstiegspunkt und der zentrale Koordinator für eine iOS-Anwendung. Es entspricht dem -Protokoll und ist für die Bearbeitung von hochrangigen App-Ereignissen verantwortlich, die die gesamte Anwendung betreffen. Diese Ereignisse umfassen den App-Start, die Beendigung, Speicherwarnungen, den Hintergrundabruf und die Fernbenachrichtigungsregistrierung. Das App Delegate-Objekt wird beim Start automatisch vom System instanziiert und bleibt während der gesamten Lebensdauer des Prozesses am Leben.

Kernlebenszyklusmethoden

Der App Delegate definiert mehrere kritische Methoden, die das System als Reaktion auf Änderungen des App-Status aufruft:

  • – Aufruf nach dem Start der App. Hier initialisieren Sie SDKs von Drittanbietern, konfigurieren Kerndatenstapel, richten ein globales Erscheinungsbild ein und stellen den Status der App wieder her. Die Rückgabe von zeigt an, dass die App die URL oder Aktivität, die den Start verursacht hat, nicht verarbeiten kann.
  • — Wird aufgerufen, wenn die App vom inaktiven zum aktiven Zustand wechselt.
  • – Wird aufgerufen, wenn die App inaktiv wird (z. B. eingehender Anruf, Benutzer drückt die Schaltfläche Sperren).
  • — Gesendet, wenn die App in den Hintergrund wechselt.
  • – Kurz vor der App-Rückkehr in den Vordergrund nach dem Hintergrund aufgerufen.
  • — Wird aufgerufen, wenn die App kurz vor der Beendigung steht. Speichern Sie kritische Daten und veröffentlichen Sie Ressourcen. Hinweis: Dies wird nicht in modernen iOS-Versionen für Apps im Hintergrund aufgerufen, es sei denn, die App wird speziell getötet.

Zusätzliche Zuständigkeiten

Neben dem Lifecycle Management übernimmt der App Delegate mehrere App-weite Services:

  • Remote und lokale Benachrichtigungen: Registrieren Sie sich für Fernbenachrichtigungen über und bearbeiten Sie eingehende Benachrichtigungen mit .
  • Verarbeitung von URLs und Handoff: Der App-Delegierte reagiert auf benutzerdefinierte URL-Schemata und universelle Links durch und verwaltet die Handoff-Aktivität über .
  • Memory Warnings: ermöglicht es der App, Caches, Bilder und andere Einwegressourcen freizugeben.
  • Hintergrund-Abruf: Implementieren Sie , um Inhalte regelmäßig herunterzuladen, während sich die App im Hintergrund befindet.
  • Watch Connectivity and App Groups: Koordinieren Sie den Datenaustausch zwischen der iOS-App und der Begleit-Watch-App über den App-Delegierten.

Historischer Kontext

Vor iOS 13 war der App Delegate auch für die Verwaltung der einzelnen Fensterinstanz der App verantwortlich. Entwickler stellten den Root View Controller innerhalb von FLT: 15 ein. Dieses Design war einfach, aber einschränkend - es konnte nicht mehrere gleichzeitige Fenster unterstützen. Die Einführung von Szenen in iOS 13 verlagerte die Fensterverwaltung auf separate Delegiertenobjekte, so dass der App Delegate sich ausschließlich auf app-weite Anliegen konzentrieren konnte.

Was ist ein Scene Delegate?

Mit iOS 13 und iPadOS 13 hat Apple das UISceneDelegate Protokoll eingeführt, um mehrere Fenster pro App zu unterstützen. Eine Szene repräsentiert eine Instanz der Benutzeroberfläche Ihrer App, die normalerweise von einem Objekt unterstützt wird. Jede Szene hat ihren eigenen Lebenszyklus und kann auf einem separaten Display oder in einem separaten Bereich auf dem iPad angezeigt werden. Der Scene Delegate verwaltet den Lebenszyklus, den Zustand der Benutzeroberfläche und die Interaktionen einer bestimmten Szene.

Multi-Window-Unterstützung ermöglichen

Um Szenen zu verwenden, müssen Sie sich anmelden, indem Sie die Ihrer App mit der Taste “Application Scene Manifest” konfigurieren. Dieses Manifest definiert die Szenenkonfigurationen, einschließlich der Klassennamen der Delegierten und Sitzungsrollen. Ohne dieses Manifest behandelt iOS die App als Single-Fenster und verwendet weiterhin die Legacy-App Delegate-Fensterverwaltung.

Core Scene Lifecycle Methoden

Der Szenendelegierte implementiert Methoden analog zum App-Delegierten, die jedoch auf eine Szene beschränkt sind:

  • – Wird aufgerufen, wenn eine neue Szene der App hinzugefügt werden soll. Hier richten Sie den Root View Controller der Szene und die erste Benutzeroberfläche ein. Sie erhalten ein -Objekt, das Informationen über die URL, Aktivität oder Verknüpfung bereitstellt, die die Szene ausgelöst hat.
  • — Die Szene wird aktiv (Vordergrund und im Fokus).
  • — Die Szene ist dabei, inaktiv zu werden (z.B. Multitasking-Geste, App-Switcher).
  • — Die Szene bewegt sich in den Hintergrund.
  • — Die Szene ist dabei, im Vordergrund aktiv zu werden.
  • – Wird aufgerufen, wenn das System die Szene aus der App entfernt (z. B. der Benutzer schließt ein Fenster auf dem iPad oder die App wechselt zum Hintergrund und das System beschließt, die Szene zu verwerfen).

Szenensitzungen und Rollen

Jede Szene ist mit einem -Objekt verknüpft, das über alle Starts hinweg bestehen bleibt. Sessions können wiederverwendet oder neu erstellt werden. Die Session enthält eine -Eigenschaft, die angibt, ob die Szene für die Haupt-App-Schnittstelle () oder ein externes Display () bestimmt ist. Der Szenendelegierte kann die Rolle der Session überprüfen, um sein Verhalten anzupassen.

Szenendelegierte in SwiftUI

Bei SwiftUI-Apps wird der Szenendelegierte oft automatisch generiert, wenn Sie ein neues Projekt starten, das auf iOS 14+ abzielt. Sie können jedoch weiterhin einen benutzerdefinierten Szenendelegierten erstellen, indem Sie den -Eigenschafts-Wrapper in Ihrer -Struktur verwenden. Die -Szene von SwiftUI verwendet implizit , aber Sie können das Verhalten der Delegierten überschreiben, indem Sie sich in einem Adapter an halten.

Hauptunterschiede zwischen App Delegate und Scene Delegate

Während beide Delegierten den Lebenszyklus verwalten, unterscheiden sich ihr Umfang und ihre Verantwortlichkeiten erheblich:

  • Scope: Der App Delegate arbeitet auf der Ebene des Anwendungsprozesses; es gibt nur einen pro App. Der Szene Delegate arbeitet auf der Szene (oder Fenster) Ebene; es können mehrere Szene Delegaten gleichzeitig laufen.
  • Einführung: App Delegate gibt es seit iOS 2. Szene Delegate wurde in iOS 13 eingeführt, um Multi-Fenster-Unterstützung zu ermöglichen.
  • Window-Verwaltung: In Legacy-Apps besitzt der App-Delegierte das Fenster. In szenenbasierten Apps besitzt jeder Szenendelegierte das Fenster seiner Szene. Der App-Delegierte greift nicht mehr direkt auf das Fenster zu.
  • Staatserhaltung: Apps, die Szenen verwenden, sollten Zustandserhaltung und -wiederherstellung auf Szenenebene (über oder ) implementieren, nicht nur durch den App-Delegierten.
  • Hintergrundaufgaben: Im Allgemeinen können Hintergrundaufgaben appweit (via App Delegate) oder per Szene (via Scene Delegate) ausgelöst werden, bestimmte Hintergrundmodi wie Hintergrundabrufe werden jedoch weiterhin vom App Delegate verwaltet.

Wie sie in einer modernen App zusammenarbeiten

In einer szenenbasierten iOS-App bilden der App Delegate und der Szene Delegate eine geschichtete Architektur. Der App Delegate initialisiert die gemeinsam genutzte Infrastruktur (Logging, Analyse, Kerndatenbank) und behandelt Ereignisse, die nicht zu einer bestimmten Szene gehören. Wenn das System neue Inhalte anzeigen muss, erstellt es eine Szene und verknüpft einen Szene Delegate. Der Szene Delegate erstellt dann die Benutzeroberfläche, verbindet sich mit der Szenesitzung und verwaltet Benutzerinteraktionen innerhalb dieser Szene.

Koordination während des Starts

Wenn ein Benutzer die App öffnet, ruft das System die App Delegate auf . Nach dieser Rückkehr erstellt das System eine Szene und ruft auf der Szene Delegate auf. Wenn die App über Handoff oder eine Verknüpfung wieder geöffnet wird, liefert die die entsprechende Aktivität, URL oder Benutzeraktivität an den entsprechenden Szene Delegate.

Wiederherstellung des Staates in allen Szenen

Die Zustandswiederherstellung ist für nahtloses Multitasking von entscheidender Bedeutung. Jede Szene sollte ihren Zustand mit in der Methode des Szenendelegierten codieren. Der App-Delegierte ist für die Bereitstellung von Aktivitätstypen über beim Erstellen einer Szenensitzung verantwortlich. Diese Koordination stellt sicher, dass wieder geöffnete Szenen ihren Inhalt wiederherstellen - zum Beispiel kann eine Dokument-App die genaue Datei, die der Benutzer in jedem Fenster bearbeitet hat, wieder öffnen.

Handhabung von externen Displays

Auf dem iPad kann eine Szene auf einem externen Monitor über „AirPlay“ oder „Sidecar“ erstellt werden. Durch die Überprüfung der Rolle kann der Szenendelegierte seine Benutzeroberfläche an die Auflösung und die Fähigkeiten des externen Displays anpassen. Der App-Delegierte weiß nicht, auf welcher Anzeige sich die Szene befindet, wobei die Verantwortlichkeiten sauber getrennt bleiben.

Praktisches Beispiel: Einrichten einer szenenbasierten iOS App

Gehen wir die Schritte durch, um eine neue UIKit-App mit Szenendelegierten zu konfigurieren.Angenommen, Sie beginnen mit einem leeren Xcode-Projekt mit aktivierter Option "Szenendelegierte verwenden".

Schritt 1: Info.plist Konfiguration

Xcode automatically adds the “Application Scene Manifest” entry. Open the Info.plist and verify it contains a dictionary with:

  • Mehrere Windows aktivieren: JA (wenn Sie mehrere Fenster zulassen möchten; ansonsten NEIN).
  • Szenenkonfigurationen: Eine Reihe von Wörterbüchern, die jeweils eine Szenenrolle (z. B. “Window Application”) und einen Klassennamen für Delegierte definieren (z. B. “$(PRODUCT MODULE NAME).SzenenDelegieren”).

Bei einer Single-Window-App können Sie mehrere Fenster deaktiviert lassen, aber Sie benötigen immer noch die Szenenkonfiguration, um Scene Delegate zu verwenden.

Schritt 2: Implementieren Sie den App Delegate

Entfernen Sie in eine beliebige Fenstereigenschaft, implementieren Sie stattdessen nur app-weite Methoden:

import UIKit

@main
class AppDelegate: UIResponder, UIApplicationDelegate {
 func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool {
 // Configure analytics, core data, third-party SDKs
 return true
 }

 func application(_ application: UIApplication, configurationForConnecting connectingSceneSession: UISceneSession, options: UIScene.ConnectionOptions) -> UISceneConfiguration {
 // Return a scene configuration to use for the new scene
 return UISceneConfiguration(name: "Default Configuration", sessionRole: connectingSceneSession.role)
 }

 func application(_ application: UIApplication, didDiscardSceneSessions sceneSessions: Set) {
 // Called when the user discards a scene (e.g., closing a window)
 }
}

Schritt 3: Implementieren Sie Szenendelegierte

Verwalten Sie in das Fenster und den Szenenlebenszyklus:

import UIKit

class SceneDelegate: UIResponder, UIWindowSceneDelegate {
 var window: UIWindow?

 func scene(_ scene: UIScene, willConnectTo session: UISceneSession, options connectionOptions: UIScene.ConnectionOptions) {
 guard let windowScene = (scene as? UIWindowScene) else { return }
 let window = UIWindow(windowScene: windowScene)
 let viewController = ViewController()
 window.rootViewController = viewController
 self.window = window
 window.makeKeyAndVisible()
 }

 func sceneDidDisconnect(_ scene: UIScene) {
 // Called when the scene is being removed from the app
 }

 func sceneDidBecomeActive(_ scene: UIScene) {
 // Resume tasks
 }

 func sceneWillResignActive(_ scene: UIScene) {
 // Pause tasks
 }
}

Schritt 4: Umgang mit den Optionen für die Verbindung der Szene

Die in bietet Verknüpfungen, URL-Kontexte und Benutzeraktivitäten, zum Beispiel zum Öffnen eines bestimmten Dokuments, wenn der Benutzer auf eine Datei tippt:

if let urlContext = connectionOptions.urlContexts.first {
 // Intialize a document viewer with the URL
 urlContext.url.startAccessingSecurityScopedResource()
 // Load document and set root view controller
}

Diese Trennung hält den App Delegate schlank und jeder Szene Delegate konzentriert sich auf sein eigenes Fenster.

Best Practices und häufige Fallstricke

Wann App Delegate vs. Scene Delegate verwendet werden sollte

  • Verwenden Sie den App Delegate für die Initialisierung, die genau einmal pro App-Start erfolgen muss, wie z. B. Crash-Reporting, Benutzerauthentifizierung oder Datenbankmigration.
  • Verwenden Sie den Szenendelegierten für die Benutzeroberflächeneinrichtung, die Controllerinstanziation und die szenenspezifische Zustandsverwaltung.
  • Greifen Sie not auf das geteilte zu, um das Fenster zu erhalten; stattdessen rufen Sie das Fenster vom Delegierten der aktiven Szene ab.

Migration von Legacy Apps

Wenn Sie eine vorhandene Single-Window-App haben, die den App-Delegierten für die Fensterverwaltung verwendet, können Sie Szenen übernehmen, indem Sie das Szenenmanifest und den bewegten Fenster-bezogenen Code zu einem neuen Szenendelegierten hinzufügen.

Gedächtnis und Performance Überlegungen

Jede Szene verbraucht Speicher und Ressourcen. Auf dem iPad kann das System Szenen trennen, wenn der Speicher niedrig ist. Implementieren Sie , um szenenspezifische Ressourcen freizugeben. Vermeiden Sie es, große Caches oder Daten im Szenendelegierten zu speichern; verwenden Sie den App-Delegierten für app-weite Caches, die die Szenentrennung überleben können.

Betreuen von Delegaten in SwiftUI

In SwiftUI können Sie einen benutzerdefinierten App-Delegierten über anhängen. Für die Szenenverwaltung verwendet SwiftUI jedoch automatisch die Standard-Szenenkonfiguration. Wenn Sie benutzerdefiniertes Szenenverhalten benötigen (z. B. URL-Kontexte pro Fenster), erstellen Sie eine Klasse, die entspricht, und weisen Sie sie im Manifest oder über den -Modifikator zu.

Schlussfolgerung

Der App Delegate und der Scene Delegate sind komplementäre Säulen der modernen iOS-App-Architektur. Der App Delegate bietet einen einzigen Kontrollpunkt für Ereignisse auf Anwendungsebene, während die Scene Delegaten den Lebenszyklus und die Benutzeroberfläche pro Fenster verwalten. Indem Sie ihre unterschiedlichen Verantwortlichkeiten und ihre Zusammenarbeit verstehen, können Sie Apps erstellen, die anmutig mehrere Fenster, Statuswiederherstellung und responsive Benutzererfahrungen auf allen iOS-Geräten unterstützen. Für weitere Informationen lesen Sie Apples UIApplicationDelegate-Dokumentation, die UISceneDelegate-Dokumentation und die Verwaltung des Lifecycles Ihrer App Anleitung.