Note :
Bien qu'il ait été répondu que ce n'était pas possible, je pense que c'est une question valable pour un nouveau développeur iOS et il y a quelque chose qu'il peut faire, ce qui est probablement ce qu'il veut.
Il existe un moyen de redémarrer votre application du point de vue de l'utilisateur qui n'est pas techniquement redémarrer ou quitter l'application iOS. Comme indiqué dans d'autres réponses, une application iOS ne devrait jamais se terminer explicitement, car cela n'est pas autorisé sur iOS.
Ma réponse :
Si vous voulez que votre application revienne à l'état dans lequel elle était au lancement, ce n'est pas possible à 100%, mais je vais vous expliquer une façon d'y parvenir qui devrait suffire à toutes fins utiles.
La première chose à faire est de recréer votre contrôleur de vue Root. Je recommande de le faire à partir d'une méthode dans le délégué de l'application comme ceci :
- (void)resetAppToFirstController
{
self.window.rootViewController = [[MyMainViewController alloc] initWithNibName:nil bundle:nil];
}
Dans de nombreux cas, cela sera suffisant, mais tout état d'application que vous avez doit également être réinitialisé par cette méthode. Par exemple, déconnectez un utilisateur, réinitialisez tout état non persistant et annulez (relâchez) tous les objets que vous pouvez. Cette méthode peut également être utilisée pour créer initialement votre premier contrôleur de vue à partir des éléments suivants application:didFinishLaunchingWithOptions
.
Classes du cadre et singletons :
Vous ne serez pas en mesure de réinitialiser complètement l'état des singletons du framework ou des instances per-app, telles que celles-ci :
[UIApplication sharedApplication];
[NSNotificationCenter defaultCenter];
[NSUserDefaults standardUserDefaults];
[UIScreen screens];
// etc...
C'est probablement bien, car vous ne devriez pas y stocker d'état non persistant de toute façon (à l'exception de NSNotificationCenter
mais tous les observateurs enregistrés devraient avoir été supprimés lorsque les objets ont été libérés). Si vous souhaitez initialiser ou réinitialiser l'état du framework, vous pouvez le faire dans la même procédure que celle utilisée pour l'initialisation. resetAppToFirstController
méthode. Quoi qu'il en soit, il ne devrait pas y avoir besoin de recréer ces éléments, ou la méthode window
objet.
Si vous avez vos propres singletons, vous pouvez les recréer en les stockant dans une classe porteuse de singleton (qui est elle-même un vrai singleton). Conceptuellement, il s'agit d'une simple classe singleton avec des propriétés pour chacun de vos autres singletons et une propriété reset
pour les annuler et les libérer tous. Vos autres singletons doivent utiliser cette classe (au lieu d'une variable statique ou globale) pour stocker les instances de singletons. Faites attention si vous utilisez des bibliothèques tierces, car elles peuvent également utiliser des singletons et vous devrez vous assurer qu'elles utilisent également votre porte-singletons afin de pouvoir les réinitialiser si nécessaire. Je pense que cette technique est une bonne pratique de toute façon, parce que dans certains cas (par exemple les tests unitaires) vous voulez que les objets qui sont habituellement des singletons s'en aillent et se réinitialisent à un état immaculé. Cependant, vous ne voulez pas coupler les implémentations des singletons avec votre porte-singletons, donc une bonne façon d'implémenter ceci est d'utiliser un objet de type NSMutableDictionary
comme objet associé sur [UIApplication sharedApplication]
avec les noms des classes singleton comme clés. Cependant, je m'éloigne un peu du sujet car il s'agit d'une technique plus avancée qui dépasse le cadre de cette question.
Ce qui précède devrait suffire à "réinitialiser" votre application en ce qui concerne l'utilisateur. Vous pouvez même afficher à nouveau l'écran d'accueil si vous le souhaitez en tant que premier contrôleur de vue.
0 votes
Duplication possible de Comment quitter correctement une application iPhone ?
12 votes
Vous ne pouvez pas vraiment le forcer à redémarrer. Vous pouvez le forcer à mourir, mais vous serez probablement rejeté pour cela. Vous devriez plutôt concevoir votre application de manière à pouvoir effacer par programme toutes les données et les réinitialiser vous-même.
0 votes
Tant que le crash est initié par l'utilisateur, il ne devrait pas être rejeté. Par exemple, une application bancaire peut avertir l'utilisateur que quelque chose n'est pas synchronisé, ou qu'un délai trop long s'est écoulé depuis la dernière activation, et qu'il devra se reconnecter, et lui proposer un bouton "quitter maintenant" (comme seul choix). Ce n'est pas un problème car l'utilisateur s'attend à ce que cela se produise. Je ne dis pas que c'est la meilleure ou la seule façon de réinitialiser/se déconnecter, mais c'est acceptable, en ce qui concerne Apple, la dernière fois que j'ai vérifié.