iOS 13 propose une nouvelle façon d'envoyer les événements relatifs au cycle de vie des applications . Au lieu de passer par le UIApplicationDelegate
ils passent par le UIWindowSceneDelegate
qui est un UISceneDelegate
sous-protocole. UISceneDelegate
possède les méthodes de délégation importantes.
Cette modification vise à prendre en charge plusieurs fenêtres dans iOS 13. Il y a plus d'informations dans la session 212 de la WWDC 2019 " Introduction des fenêtres multiples sur l'iPad ". Les informations techniques commencent à l'adresse suivante vers 14h30 et est présenté par un homme avec des chaussures à talons très brillantes. La session courte 258 Conception de votre application pour plusieurs fenêtres propose également une excellente introduction à ce qui a changé.
Voici comment cela fonctionne : Si vous avez un " Manifeste de la scène de l'application "dans votre Info.plist et votre délégué d'application a une valeur de configurationForConnectingSceneSession
la méthode UIApplication
n'enverra pas de messages sur le cycle de vie de l'arrière-plan et du premier plan à votre délégué d'application. Cela signifie que le code de ces méthodes ne s'exécutera pas :
applicationDidBecomeActive
applicationWillResignActive
applicationDidEnterBackground
applicationWillEnterForeground
Le délégué de l'application recevra toujours le willFinishLaunchingWithOptions:
y didFinishLaunchingWithOptions:
de sorte que tout code dans ces méthodes fonctionnera comme avant.
Si vous voulez retrouver l'ancien comportement vous devez
- Supprimez l'entrée "Application Scene Manifest" du fichier Info.plist de l'application.
- Commentez ou supprimez le
application:configurationForConnectingSceneSession:options:
(ou la méthode Swift application(_:configurationForConnecting:options:)
fonction)
- Ajoutez la propriété de la fenêtre à votre délégué d'application (
@property (strong, nonatomic) UIWindow *window;
)
Vous pouvez également ouvrir le fichier SceneDelegate créé par Xcode et utiliser les nouvelles méthodes de cycle de vie qu'il contient :
- (void)sceneDidBecomeActive:(UIScene *)scene {
}
- (void)sceneWillResignActive:(UIScene *)scene {
}
... etc
Il est possible d'utiliser la nouvelle UIScene
sans adopter la prise en charge des fenêtres multiples en réglant "Enable Multiple Windows" ("UIApplicationSupportsMultipleScenes") sur "NO" dans le fichier Info.plist (c'est la valeur par défaut pour les nouveaux projets). De cette façon, vous pouvez commencer à adopter la nouvelle API par petites étapes.
Vous pouvez constater que les noms des méthodes du délégué de la scène sont très proches de ceux du délégué de l'application. Une chose déroutante est que les méthodes de l'app delegate ne sont pas dépréciées, donc vous n'obtiendrez pas d'avertissement si vous avez les deux méthodes app delegate et scene delegate en place, mais une seule sera appelée.
D'autres choses qui UISceneDelegate
prend le relais sont les activités des utilisateurs ( continueUserActivity:
etc), la restauration de l'état ( stateRestorationActivityForScene:
etc.), les questions de la barre d'état et les URL d'ouverture. (Je ne suis pas sûr qu'elles remplacent les méthodes des délégués de l'application). Il y a également des notifications analogues pour les événements du cycle de vie (tels que UISceneWillDeactivateNotification
).
De la session WWDC, quelques images pour vous :
Les équivalents des fonctions pour Swift :
Les responsabilités de la classe :