Table of Contents
Begrijpen van de rol van gedelegeerden en gedelegeerden van apps bij de ontwikkeling van iOS
Sinds de vroegste versies van iOS, de UIApplicationDelegate] protocol is de ruggengraat van iOS app lifecycle management. Echter, de invoering van multi-window ondersteuning in iOS 13 fundamenteel veranderd hoe ontwikkelaars omgaan met gebruikersinterfaces. Apple introduceerde de UISceneDelegate] protocol om app-brede verantwoordelijkheden te ontkoppelen van per-window management. Het begrijpen van de precieze rollen van deze twee afgevaardigden is essentieel voor het bouwen van moderne, multi-window iOS-toepassingen . Of het nu richten van iPhones, iPads, of Mac inschakelen. Dit artikel biedt een uitgebreide verkenning van beide afgevaardigden, hun levenscyclus methoden, hoe ze interactie, en beste praktijken om ze effectief te gebruiken.
Wat is een App Delegate?
De App Delegate is het instappunt en centrale coördinator voor een iOS-applicatie. Het voldoet aan het protocol en is verantwoordelijk voor het verwerken van app-evenementen op hoog niveau die van invloed zijn op de gehele toepassing. Deze gebeurtenissen omvatten app-start, beëindiging, geheugenwaarschuwingen, achtergrondophaling en remote notificatie registratie. Het App Delegate object wordt automatisch gestart door het systeem bij de lancering en blijft leven voor de levensduur van het proces.
Kernlifecyclemethoden
De App Delegate definieert verschillende kritische methoden die het systeem oproept in reactie op wijzigingen in de app:
- . . Gebeld nadat de app is gestart. Hier initialiseer je SDK's van derden, configureer je de kerndata stacks, stel je een globaal uiterlijk in en herstel je de status van de app. Returning geeft aan dat de app de URL of activiteit die de lancering heeft veroorzaakt niet kan verwerken.
- . Aangeroepen wanneer de app overgaat van inactieve naar actieve toestand. Gebruik dit om gepauzeerde taken te hervatten, UI te vernieuwen of animaties opnieuw te starten.
- . . Gebeld wanneer de app op het punt staat inactief te worden (bijvoorbeeld, inkomende telefoongesprek, gebruiker drukt op de knop Vergrendelen). Opslaan status, pauzeren games, en verminderen van het gebruik van hulpbronnen.
- . . Verzonden wanneer de app naar de achtergrond verhuist. Voer de laatste opruiming uit, geef gedeelde bronnen vrij en plan achtergrondtaken.
- .Opgeroepen wanneer de app wordt beëindigd. Sla kritieke gegevens en releasebronnen op. Opmerking: dit wordt niet op moderne iOS-versies voor apps op de achtergrond aangeroepen, tenzij specifiek gedood.
Aanvullende verantwoordelijkheden
Naast het beheer van de levenscyclus verzorgt de App Delegate verschillende diensten die op de gehele app zijn gericht:
- Remote and Local Notifications: Registreer voor meldingen op afstand via en behandel binnenkomende meldingen met .
- Het hanteren van URL's en Handoff: De App Delegate reageert op aangepaste URL-schema's en universele links via ] en beheert Handoff-activiteit via .
- Geheugenwaarschuwingen: laat de app toe om caches, afbeeldingen en andere beschikbare middelen vrij te geven.
- Achtergrond Fetch: Implementeer om inhoud periodiek te downloaden terwijl de app op de achtergrond staat.
- Bekijk Connectiviteit en App Groepen: Coördineer het delen van gegevens tussen de iOS-app en de metgezel Bekijk de app via de App Delegate.
Historische context
Voordat iOS 13, de App Delegate was ook verantwoordelijk voor het beheer van de app . Ontwikkelaars de root view controller in . Dit ontwerp was eenvoudig, maar beperkend .. kon het niet meerdere gelijktijdige vensters ondersteunen. De introductie van scènes in iOS 13 verplaatst vensterbeheer om afzonderlijke objecten te delegeren, waardoor de App Delegate vrij om zich uitsluitend te concentreren op app-brede zorgen.
Wat is een Scene Delegate?
Met iOS 13 en iPadOS 13 introduceerde Apple het UISceneDelegate protocol om meerdere vensters per app te ondersteunen. Een scène vertegenwoordigt één instantie van uw apps gebruikersinterface, meestal ondersteund door een object. Elke scène heeft zijn eigen levenscyclus en kan worden weergegeven op een apart scherm of in een aparte ruimte op iPad. De Scene Delegate[] beheert een specifieke scèneslevenscyclus, gebruikersinterfacetoestand en interacties.
Multi-Window ondersteuning inschakelen
Om scènes te gebruiken, moet u zich aanmelden door uw app te configureren met de .Application Scene Manifest toets. Dit manifest definieert de scèneconfiguraties, inclusief klassenamen en sessierollen. Zonder dit manifest behandelt iOS de app als enkel venster en blijft het gebruik van het legacy App Delegate window management.
Kern-scène-levenscyclusmethoden
De Scene Delegate implementeert methoden die analoog zijn aan de App Delegate maar die betrekking hebben op één scène:
- . . Gebeld wanneer een nieuwe scène wordt toegevoegd aan de app. Dit is waar u de scène root view controller en de initiële UI instellen. U ontvangt een object dat informatie geeft over de URL, activiteit of snelkoppeling die de scène heeft geactiveerd.
- De scène wordt actief (voorgrond en in focus). Gepauzeerde activiteiten hervatten, animaties starten en gegevens vernieuwen.
- De scène staat op het punt inactief te worden (bv. multitasking gebaar, app switcher).
- De scène verplaatst zich naar de achtergrond. Release resources, opslaan gegevens, en plannen achtergrondtaken voor deze scène.
- De scène staat op het punt actief te worden op de voorgrond. Verandert de achtergrond.
- . . Geroepen wanneer het systeem de scène uit de app verwijdert (bijvoorbeeld, gebruiker sluit een venster op iPad, of de app verplaatst naar achtergrond en het systeem besluit de scène te verwerpen). Voer de definitieve opruiming specifiek voor die scène.
Scènesessies en rollen
Elke scène wordt geassocieerd met een object dat blijft bestaan over de lanceringen. Sessies kunnen worden hergebruikt of opnieuw worden aangemaakt. De sessie bevat een eigenschap die aangeeft of de scène voor de hoofdapp interface () of een extern display () is. De Scene Delegate kan de rol van de sessie controleren om zijn gedrag aan te passen.
Scèneafgevaardigde in SwiftUI
Voor SwiftUI-apps wordt de Scene Delegate vaak automatisch gegenereerd wanneer u een nieuw project start dat gericht is op iOS 14+. Echter, u kunt nog steeds een aangepaste Scene Delegate maken door gebruik te maken van de ] eigenschapswikkelaar in uw structuur. SwiftUI
Belangrijkste verschillen tussen gedelegeerde en gedelegeerde gedelegeerde apps
Hoewel beide afgevaardigden de levenscyclus beheren, verschillen hun reikwijdte en verantwoordelijkheden aanzienlijk:
- Scope: De App Delegate werkt op het niveau van het toepassingsproces; er is slechts één per app. De Scene Delegate werkt op het niveau van de scène (of vensters); u kunt meerdere scèneafgevaardigden tegelijkertijd draaien.
- Inleiding: De gedelegeerde van de App bestaat sinds iOS 2. Scene Delegate werd geïntroduceerd in iOS 13 om multi-venster ondersteuning mogelijk te maken.
- Window Management: In legacy-apps bezit de App Delegate het venster. In scene-gebaseerde apps bezit elke Scene Delegate zijn scène-venster. De App Delegate heeft geen direct toegang meer tot het venster.
- State conservation: Apps die scènes gebruiken, moeten staatbehoud en herstel op scèneniveau implementeren (via of ), niet alleen via de App Delegate.
- Achtergrondtaken: In het algemeen kunnen achtergrondtaken app-breed (via App Delegate) of per-scene (via Scene Delegate) worden geactiveerd. Echter, bepaalde achtergrondmodi zoals achtergrond fetch worden nog steeds beheerd door de App Delegate.
Hoe ze samenwerken in een moderne app
In een scène-gebaseerde iOS-app, de App Delegate en Scene Delegate vormen een gelaagde architectuur. De App Delegate initialiseert gedeelde infrastructuur .Initialiseert downloaden, analytics, core database ..en behandelt gebeurtenissen die niet behoren tot een bepaalde scène. Wanneer het systeem moet nieuwe inhoud te tonen, het creëert een scène en associeert een Scene Delegate. De Scene Delegate bouwt vervolgens de UI, verbindt met de scène sessie, en beheert de gebruikersinteracties binnen die scène.
Coördinatie tijdens de lancering
Wanneer een gebruiker de app opent, roept het systeem de App Delegates aan. Nadat dit terugkeert, maakt het systeem een scène en roept aan op de Scene Delegate. Als de app wordt heropend via Handoff of een snelkoppeling, levert de de relevante activiteit, URL of gebruikersactiviteit aan de desbetreffende Scene Delegate.
Staat herstel over de scènes
Staat herstel is cruciaal voor naadloze multitasking. Elke scène moet zijn toestand coderen met behulp van in de Scene Delegate . De App Delegate is verantwoordelijk voor het verstrekken van activiteitentypen via ] bij het maken van een scènesessie. Deze coördinatie zorgt ervoor dat heropende scènes hun inhoud herstellen bijvoorbeeld, een document app kan het exacte bestand dat de gebruiker was aan het bewerken in elk venster te openen.
Externe weergaven verwerken
Op iPad kan een scène worden gemaakt op een externe monitor via
Praktisch voorbeeld: Een op scène gebaseerde iOS-app instellen
Laten we door de stappen lopen om een nieuwe UIKit-app te configureren met scèneafgevaardigden. Stel dat je begint met een leeg Xcode-project met de optie
Stap 1: Info.plist configuratie
Xcode automatically adds the “Application Scene Manifest” entry. Open the Info.plist and verify it contains a dictionary with:
- Steek meerdere vensters in: JA (als u meerdere vensters wilt toestaan; anders NEE).
- Scene Configurations: Een reeks woordenboeken, elk definiëren een scènerol (bijv., .Window Application
Voor een single-window app kunt u meerdere vensters uitschakelen, maar u heeft nog steeds de scèneconfiguratie nodig om Scene Delegate te gebruiken.
Stap 2: Implementeer App Delegate
In verwijdert u alle venstereigenschap. In plaats daarvan implementeert u alleen app-brede 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)
}
}
Stap 3: Implementeer Scene Delegate
In , beheren van het venster en scène levenscyclus:
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
}
}
Stap 4: Behandeling van scène-verbindingsopties
De in biedt snelkoppelingen, URL-contexten en gebruikersactiviteiten. Bijvoorbeeld om een specifiek document te openen wanneer de gebruiker een bestand tikt:
if let urlContext = connectionOptions.urlContexts.first {
// Intialize a document viewer with the URL
urlContext.url.startAccessingSecurityScopedResource()
// Load document and set root view controller
}
Deze scheiding houdt de App Delegate lean en elke Scene Delegate gericht op zijn eigen venster.
Beste praktijken en gemeenschappelijke valkuilen
Wanneer moet u App Delegate vs. Scene Delegate gebruiken
- Gebruik de App Delegate voor initialisatie die precies één keer per app start moet gebeuren, zoals crash rapportage, gebruikersauthenticatie of database migratie.
- Gebruik de Scene Delegate voor UI-configuratie, weergave controller instantiation, en scène-specifieke state management.
- Doe niet] toegang tot het gedeelde om het venster te krijgen; in plaats daarvan, het venster ophalen uit de gedelegeerde actieve scènes. In UIKit, gebruik maar geef de voorkeur aan het passeren van scènes expliciet.
Migreren van Legacy Apps
Als u een bestaande single-window-app hebt die de App Delegate gebruikt voor windowmanagement, kunt u scènes adopteren door de scène manifest toe te voegen en venster-gerelateerde code te verplaatsen naar een nieuwe Scene Delegate. Test grondig, vooral als uw app afhankelijk is van , wat wordt afgebroken in iOS 13+.
Geheugen- en prestatieoverwegingen
Elke scène verbruikt geheugen en middelen. Op iPad kan het systeem scènes verbreken wanneer het geheugen laag is. Implementeer om scènespecifieke bronnen vrij te geven. Vermijd het opslaan van grote caches of gegevens in de Scene Delegate; gebruik de App Delegate voor app-brede caches die scène loskoppeling kunnen overleven.
Afhandeling van gedelegeerden in SwiftUI
In SwiftUI kunt u een aangepaste App Delegate via koppelen. Echter, voor scènebeheer gebruikt SwiftUI
Conclusie
De App Delegate en Scene Delegate zijn complementaire pijlers van moderne iOS-app architectuur. De App Delegate biedt één enkel controlepunt voor applicatie-niveau evenementen, terwijl Scene Delegates per window lifecycle en gebruikersinterface beheren. Door hun eigen verantwoordelijkheden te begrijpen en hoe ze samenwerken, kunt u apps bouwen die op een sierlijke manier meerdere vensters, staatherstel en responsieve gebruikerservaringen ondersteunen op alle iOS-apparaten. Raadpleeg Apple. UIApplicationDelegate documentatie[, de UISceneDelegate documentatie[, en de Managing Your Apps Lifecycle[.