Table of Contents
Comprendre le rôle des délégués de l'application et des délégués de la scène dans le développement iOS
Depuis les premières versions d'iOS, le protocole UIApplicationDelegate est l'épine dorsale de la gestion du cycle de vie des applications iOS. Cependant, l'introduction du support multi-fenêtres dans iOS 13 a fondamentalement modifié la façon dont les développeurs gèrent les interfaces utilisateur. Apple a introduit le protocole UISceneDelegate[ pour découpler les responsabilités de l'application à l'échelle de l'application de la gestion par-fenêtre.
Qu'est-ce qu'un Délégué App?
Le App Delege est le point d'entrée et le coordonnateur central d'une application iOS. Il est conforme au protocole et est responsable de la gestion des événements app de haut niveau qui affectent l'application entière. Ces événements comprennent le lancement de l'application, la terminaison, les avertissements de mémoire, la récupération de fond et l'enregistrement de notification à distance. L'objet App Delege est automatiquement instantané par le système au lancement et reste en vie pendant toute la durée du processus.
Méthodes fondamentales du cycle de vie
Le Délégué App définit plusieurs méthodes critiques que le système appelle en réponse aux changements d'état app :
- — Appelé après le lancement de l'application. C'est là que vous initialisez des SDK tiers, configurez les piles de données de base, définissez l'apparence globale et restaurez l'état de l'application.
- — Invoqué lorsque l'application passe de l'état inactif à l'état actif. Utilisez ceci pour reprendre les tâches interrompues, rafraîchir l'interface utilisateur ou redémarrer les animations.
- — Appelé lorsque l'application est sur le point de devenir inactive (p. ex. appel téléphonique entrant, l'utilisateur appuie sur le bouton Verrouiller).
- — Envoyé lorsque l'application passe à l'arrière-plan. Effectuer le nettoyage final, libérer des ressources partagées et planifier les tâches de fond.
- — Appelé juste avant que l'application ne revienne au premier plan après avoir été mis en arrière-plan.
- — Invoqué lorsque l'application est sur le point d'être terminée. Enregistrer les données critiques et les ressources de publication. Remarque : ceci n'est pas appelé sur les versions iOS modernes pour les applications en arrière-plan à moins de tuer spécifiquement.
Responsabilités supplémentaires
Outre la gestion du cycle de vie, l'App Delege gère plusieurs services à l'échelle de l'application :
- Notifications à distance et notifications locales:[ Inscrivez-vous aux notifications à distance par et traitez les notifications reçues avec .
- Handling URLs and Handoff: Le Délégué App répond aux schémas URL personnalisés et aux Liens Universels par et gère l'activité Handoff par .
- Mémorie Avertissements: permet à l'application de libérer des caches, des images et d'autres ressources jetables.
- Background Fetch: Mettre en œuvre pour télécharger du contenu périodiquement pendant que l'application est en arrière-plan.
- Watch Connectivité et Groupes d'applications: Coordonner le partage de données entre l'application iOS et l'application de veille compagnon via le Délégué d'applications.
Contexte historique
Avant iOS 13, le Délégué App était également responsable de la gestion de l'instance de la fenêtre unique apps. Les développeurs ont défini le contrôleur de la vue racine à l'intérieur . Ce design était simple mais limité – il ne pouvait pas supporter plusieurs fenêtres simultanées. L'introduction de scènes dans iOS 13 a déplacé la gestion de la fenêtre pour séparer les objets délégués, laissant le Délégué App libre de se concentrer exclusivement sur les préoccupations de l'application.
Qu'est-ce qu'un délégué de scène?
Avec iOS 13 et iPadOS 13, Apple a introduit le protocole UISceneDelegate pour prendre en charge plusieurs fenêtres par application. Une scène représente une instance de votre interface utilisateur app, généralement soutenue par un objet . Chaque scène a son propre cycle de vie et peut être affichée sur un écran séparé ou dans un espace séparé sur iPad. Le Scène Délégué gère une scène spécifique, l'état de l'interface utilisateur et les interactions.
Aide multi-fenêtres
Pour utiliser les scènes, vous devez choisir en configurant vos applications avec la touche -Application Scene Manifest. Ce manifeste définit les configurations de scènes, y compris les noms de classes et les rôles de session. Sans ce manifeste, iOS traite l'application comme une fenêtre unique et continue à utiliser la gestion de la fenêtre de l'application déléguée.
Méthodes du cycle de vie des scènes principales
Le Délégué de la scène met en œuvre des méthodes analogues au Délégué de l'application mais incluaient une scène :
- — Appelé lorsqu'une nouvelle scène est sur le point d'être ajoutée à l'application. C'est là que vous avez configuré le contrôleur de vue racine de la scène et l'interface utilisateur initiale. Vous recevez un objet qui fournit des informations sur l'URL, l'activité ou le raccourci qui a déclenché la scène.
- — La scène devient active (avant-plan et en focus). Reprendre les activités en pause, commencer des animations et rafraîchir les données.
- — La scène est sur le point de devenir inactive (p. ex., geste multitâche, commutateur d'application).
- — La scène se déplace vers le fond. Relâchez les ressources, enregistrez les données et planifiez les tâches de fond pour cette scène.
- — La scène est sur le point de devenir active au premier plan.
- — Appelé lorsque le système supprime la scène de l'application (par exemple, l'utilisateur ferme une fenêtre sur iPad, ou l'application se déplace en arrière-plan et le système décide de jeter la scène). Effectuer le nettoyage final spécifique à cette scène.
Sessions et rôles de la scène
Chaque scène est associée à un objet qui persiste à travers les lancements. Les sessions peuvent être réutilisées ou créées à nouveau. La session contient une propriété qui indique si la scène est pour l'interface principale de l'application () ou un écran externe (. Le Délégué de la scène peut vérifier le rôle de la session pour adapter son comportement.
Délégué de scène à SwiftUI
Pour les applications SwiftUI, le Délégué de la scène est souvent généré automatiquement lorsque vous démarrez un nouveau projet ciblant iOS 14+. Cependant, vous pouvez encore créer un Délégué de la scène personnalisé en utilisant l'emballage de propriété dans votre structure . SwiftUI=s scene utilise implicitement , mais vous pouvez outrepasser le comportement de délégué en se conformant à dans un adaptateur.
Principales différences entre le délégué de l'application et le délégué de la scène
Bien que les deux délégués gèrent le cycle de vie, leur portée et leurs responsabilités diffèrent considérablement :
- Scope:[ Le Délégué App fonctionne au niveau du processus d'application; il n'y en a qu'un par application. Le Délégué Scène fonctionne au niveau de la scène (ou de la fenêtre); vous pouvez avoir plusieurs délégués de scène qui fonctionnent simultanément.
- Introduction: Le délégué de l'application existe depuis iOS 2. Le délégué de la scène a été introduit dans iOS 13 pour permettre le support multi-fenêtres.
- Gestion des fenêtres:[ Dans les applications existantes, le Délégué de l'App possède la fenêtre. Dans les applications basées sur les scènes, chaque Délégué de la scène possède sa fenêtre de scène. Le Délégué de l'App n'accède plus directement à la fenêtre.
- Préservation de l'état: Les applications utilisant des scènes devraient mettre en œuvre la préservation et la restauration de l'état au niveau de la scène (via ou ), pas seulement par l'intermédiaire du délégué de l'application.
- Tâches de fond: En général, les tâches de fond peuvent être déclenchées dans l'ensemble de l'application (via le délégué de l'application) ou par-scène (via le délégué de la scène).
Comment ils travaillent ensemble dans une application moderne
Dans une application iOS basée sur une scène, le Délégué App et le Délégué Scène forment une architecture en couches. Le Délégué App initialise l'infrastructure partagée – l'enchaînement, l'analyse, la base de données centrale – et gère les événements qui ne appartiennent pas à une scène particulière. Lorsque le système a besoin d'afficher un nouveau contenu, il crée une scène et associe un Délégué Scène. Le Délégué Scène construit ensuite l'interface utilisateur, se connecte à la session de la scène et gère les interactions utilisateur dans cette scène.
Coordination pendant le lancement
Lorsqu'un utilisateur ouvre l'application, le système appelle le Délégué App . Après ce retour, le système crée une scène et appelle sur le Délégué Scène. Si l'application est réouverte via Handoff ou un raccourci, le livre l'activité, l'URL ou l'activité utilisateur pertinente au Délégué Scène approprié.
Restauration d'État dans les scènes
La restauration d'état est cruciale pour un multitâche sans faille. Chaque scène doit coder son état en utilisant dans la méthode de Delegate de scène . Le Délégué de l'application est responsable de fournir des types d'activité via lors de la création d'une session de scène. Cette coordination garantit que les scènes rouvertes restaurent leur contenu – par exemple, une application document peut rouvrir le fichier exact que l'utilisateur éditait dans chaque fenêtre.
Traitement des affichages externes
Sur iPad, une scène peut être créée sur un moniteur externe via --AirPlay ou -Sidecar. - En inspectant le rôle , le Délégué de la scène peut ajuster son UI pour correspondre à la résolution et aux capacités de l'affichage externe. Le Délégué de l'application reste ignorant de l'affichage de la scène, en gardant les responsabilités clairement séparées.
Exemple pratique : Configuration d'une application iOS basée sur les scènes
Laissez passer les étapes pour configurer une nouvelle application UIKit avec les délégués de la scène. Supposez que vous êtes en commençant par un projet Xcode vide avec l'option -Use Scene Delegate.
Étape 1: Configuration d'Info.plist
Xcode automatically adds the “Application Scene Manifest” entry. Open the Info.plist and verify it contains a dictionary with:
- Activer plusieurs fenêtres[: OUI (si vous voulez autoriser plusieurs fenêtres; sinon NON).
- Configurations de scène: Un tableau de dictionnaires, chacun définissant un rôle de scène (par exemple, -Application de fenêtre) et un nom de classe de délégué (par exemple, -$(PRODUCT MODULE NAME).ScèneDelegate.
Pour une application à guichet unique, vous pouvez laisser plusieurs fenêtres désactivées, mais vous avez encore besoin de la configuration de la scène pour utiliser Scene Delegate.
Étape 2: Mettre en œuvre le délégué de l'application
Dans , supprimer toute propriété de fenêtre. Au lieu de cela, implémenter seulement des méthodes à l'échelle de l'application:
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)
}
}
Étape 3 : Mettre en oeuvre le délégué de la scène
Dans , gérer le cycle de vie de la fenêtre et de la scène :
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
}
}
Étape 4: Options de connexion de la scène de manipulation
Le dans fournit des raccourcis, des contextes d'URL et des activités de l'utilisateur. Par exemple, pour ouvrir un document spécifique lorsque l'utilisateur touche un fichier :
if let urlContext = connectionOptions.urlContexts.first {
// Intialize a document viewer with the URL
urlContext.url.startAccessingSecurityScopedResource()
// Load document and set root view controller
}
Cette séparation maintient le Délégué App et chaque Délégué Scène concentré sur sa propre fenêtre.
Meilleures pratiques et pièges communs
Quand utiliser le délégué de l'application vs délégué de la scène
- Utilisez l'App Delege pour l'initialisation qui doit se produire exactement une fois par lancement d'application, comme le rapport d'accident, l'authentification des utilisateurs ou la migration de base de données.
- Utilisez le délégué de scène pour la configuration de l'interface utilisateur, l'instantiation du contrôleur et la gestion d'état spécifique à la scène.
- Ne pas accéder au partage pour obtenir la fenêtre; au lieu de cela, récupérer la fenêtre à partir de la scène active. En UIKit, utilisez mais préférez les scènes passantes explicitement.
Migrant à partir des applications Legacy
Si vous avez une application à guichet unique existante qui utilise l'App Delegate pour la gestion des fenêtres, vous pouvez adopter des scènes en ajoutant le code de la scène manifeste et en déplaçant le lien de fenêtre à un nouveau Delegué de la scène. Testez attentivement, surtout si votre application dépend de , qui est obsolète dans iOS 13+.
Mémoire et considérations de performance
Chaque scène consomme de la mémoire et des ressources. Sur iPad, le système peut déconnecter les scènes lorsque la mémoire est basse. Implémenter pour libérer des ressources spécifiques à la scène. Éviter de stocker de grands caches ou des données dans la scène Déléguée; utiliser l'App Délégué pour les caches à l'échelle de l'application qui peuvent survivre à la déconnexion de la scène.
Gestion des délégués à SwiftUI
Dans SwiftUI, vous pouvez joindre un Délégué d'application personnalisé via . Cependant, pour la gestion de scène, SwiftUI=s utilise automatiquement la configuration de scène par défaut. Si vous avez besoin d'un comportement de scène personnalisé (par exemple, gérer des contextes URL par fenêtre), créez une classe conforme à et assignez-la dans le manifeste ou via le modificateur .
Conclusion
Le Délégué App et le Délégué Scène sont des piliers complémentaires de l'architecture moderne de l'application iOS. Le Délégué App fournit un point de contrôle unique pour les événements de niveau d'application, tandis que les Délégués Scène gèrent le cycle de vie par fenêtre et l'interface utilisateur. En comprenant leurs responsabilités distinctes et leur collaboration, vous pouvez construire des applications qui prennent en charge gracieusement plusieurs fenêtres, la restauration d'état et les expériences utilisateur réactives sur tous les appareils iOS. Pour plus de détails, consultez Apples [UIApplicationDélegate documentation, le [UISceneDélegate documentation[] et le Management de votre application Lifecycle[ guide.