Manière de sortir de l’application iPhone?

Je programme une application iPhone et je dois la forcer à quitter en raison de certaines actions de l’utilisateur. Après avoir nettoyé la mémoire de l’application allouée, quelle est la méthode appropriée pour appeler l’application?

Avez-vous essayé de exit(0) ?

Alternativement, [[NSThread mainThread] exit] , bien que je n’ai pas essayé que cela semble être la solution la plus appropriée.

Sur l’iPhone, il n’y a pas de concept pour quitter une application. La seule action qui devrait provoquer la fermeture d’une application est d’appuyer sur le bouton Accueil du téléphone, et les développeurs n’y ont pas access.

Selon Apple, votre application ne doit pas se terminer seule. L’utilisateur n’ayant pas appuyé sur le bouton Accueil, tout retour à l’écran d’accueil donne à l’utilisateur l’impression que votre application s’est bloquée. C’est un comportement déroutant et non standard qui doit être évité.

exit (0) apparaît à l’utilisateur comme un crash, alors affichez un message de confirmation à l’utilisateur. Après la confirmation suspendre (bouton Accueil appuyez sur par programmation) et attendez 2 secondes tandis que l’application passe en arrière-plan avec l’animation puis quittez la vue de l’utilisateur

 -(IBAction)doExit { //show confirmation message to user UIAlertView* alert = [[UIAlertView alloc] initWithTitle:@"Confirmation" message:@"Do you want to exit?" delegate:self cancelButtonTitle:@"Cancel" otherButtonTitles:@"OK", nil]; [alert show]; } -(void)alertView:(UIAlertView *)alertView clickedButtonAtIndex:(NSInteger)buttonIndex { if (buttonIndex != 0) // 0 == the cancel button { //home button press programmatically UIApplication *app = [UIApplication sharedApplication]; [app performSelector:@selector(suspend)]; //wait 2 seconds while app is going background [NSThread sleepForTimeInterval:2.0]; //exit app when app is in background exit(0); } } 

Ce n’est pas vraiment un moyen de quitter le programme, mais un moyen de forcer les gens à cesser de fumer.

 UIAlertView *anAlert = [[UIAlertView alloc] initWithTitle:@"Hit Home Button to Exit" message:@"Tell em why they're quiting" delegate:self cancelButtonTitle:nil otherButtonTitles:nil]; [anAlert show]; 

Accédez à votre info.plist et cochez la touche “L’application ne s’exécute pas en arrière-plan”. Cette fois, lorsque l’utilisateur clique sur le bouton d’accueil, l’application se ferme complètement.

Consultez les Q & R ici: https://developer.apple.com/library/content/qa/qa1561/_index.html

Q: Comment puis-je quitter mon application iOS par programmation?

Aucune API n’est fournie pour terminer correctement une application iOS.

Sous iOS, l’utilisateur appuie sur le bouton Accueil pour fermer les applications. Si votre application comporte des conditions dans lesquelles elle ne peut pas fournir la fonction prévue, il est recommandé d’afficher une alerte pour l’utilisateur indiquant la nature du problème et les actions possibles que l’utilisateur pourrait entreprendre. Activez le WiFi, activez les services de localisation, etc. Autoriser l’utilisateur à mettre fin à l’application à sa propre discrétion.

AVERTISSEMENT: N’appelez pas la fonction de exit . Les applications appelant exit apparaissent à l’utilisateur comme ayant planté, plutôt que de procéder à une terminaison gracieuse et de revenir à l’écran d’accueil.

En outre, les données ne peuvent pas être enregistrées car -applicationWillTerminate: et les méthodes UIApplicationDelegate similaires ne seront pas appelées si vous appelez exit.

Si lors du développement ou du test il est nécessaire de terminer votre application, la fonction d’ abort ou la macro d’assertion est recommandée

Ajouter la propriété UIApplicationExitsOnSuspend sur application-info.plist à true

Après quelques tests, je peux dire ceci:

  • en utilisant l’interface privée: [UIApplication sharedApplication] provoquera l’apparence de l’application, MAIS elle appellera - (void)applicationWillTerminate:(UIApplication *)application avant de le faire;
  • en utilisant exit(0); mettra également fin à l’application, mais elle semblera “normale” (les icons du tremplin apparaissent comme prévu, avec l’effet de zoom arrière), MAIS elle n’appellera pas la méthode de délégation d’ - (void)applicationWillTerminate:(UIApplication *)application .

Mon conseil:

  1. Appelez manuellement l’application - (void)applicationWillTerminate:(UIApplication *)application sur le délégué.
  2. Appelez exit(0); .

Votre ApplicationDelegate est averti de la fermeture intentionnelle par l’utilisateur:

 - (void)applicationWillResignActive:(UIApplication *)application { 

Quand je reçois cette notification, je viens d’appeler

  exit(0); 

Qui fait tout le travail. Et la meilleure chose est que les utilisateurs ont l’intention de se retirer, c’est pourquoi cela ne devrait pas poser de problème.

Sur mon application audio, il était nécessaire de quitter l’application après que les utilisateurs synchronisaient leur appareil alors que la musique était encore en cours de lecture. Dès que la synchronisation est terminée, je reçois une notification. Mais quitter l’application juste après cela ressemblerait à un crash.

Alors, à la place, je mets un drapeau pour quitter VRAIMENT l’application lors de la prochaine action de mise en page. Ce qui est correct pour rafraîchir l’application après une synchronisation.

Mon application a été rejetée récemment bc J’ai utilisé une méthode non documentée. Littéralement:

“Malheureusement, il ne peut pas être ajouté à l’App Store, car il utilise une API privée. L’utilisation d’API non publiques, comme indiqué dans l’accord de licence du programme pour développeurs iPhone 3.3.1, est interdite:

“3.3.1 Les applications ne peuvent utiliser les API documentées que de la manière prescrite par Apple et ne doivent utiliser ou appeler aucune API privée.”

L’API non publique incluse dans votre application est terminateWithSuccess ”

Apple dit:

“Avertissement: N’appelez pas la fonction de sortie. Les applications appelant exit apparaîtront à l’utilisateur comme ayant planté, plutôt que d’exécuter une terminaison gracieuse et de revenir à l’écran d’accueil.”

Je pense que c’est une mauvaise hypothèse. Si l’utilisateur appuie sur un bouton de fermeture et qu’un message apparaît, indiquant quelque chose comme: “L’application va maintenant se fermer”, cela ne semble pas être bloqué. Apple devrait fournir un moyen valide pour quitter une application (pas quitter (0)).

Cela a eu une bonne réponse mais a décidé de développer un peu:

Vous ne pouvez pas accepter votre application sur AppStore sans lire correctement les directives d’interface utilisateur iOS d’Apple. (Ils se réservent le droit de vous rejeter pour avoir fait quoi que ce soit contre eux) La section “Ne pas quitter le programme” html est une directive exacte sur la manière de traiter dans ce cas.

Si vous avez déjà un problème avec la plate-forme Apple, vous ne pouvez pas facilement trouver une solution, consultez HIG. Il est possible qu’Apple ne veuille tout simplement pas que vous le fassiez et ils le font généralement (je ne suis pas Apple, donc je ne peux pas toujours le garantir) le disent dans leur documentation.

Nous ne pouvons pas quitter l’application en utilisant les fonctions exit(0) et abort() , car Apple déconseille fortement l’utilisation de ces fonctions. Bien que vous puissiez utiliser ces fonctions à des fins de développement ou de test.

Si lors du développement ou du test il est nécessaire de terminer votre application, la fonction d’abandon ou la macro d’assertion est recommandée

S’il vous plaît trouver ce fil d’Apple Q & A pour obtenir plus d’informations.

Comme l’utilisation de cette fonction crée une impression, l’application se bloque. J’ai donc eu une suggestion, telle que nous pouvons afficher Alert avec le message de résiliation à l’utilisateur averti sur la fermeture de l’application, en raison de l’indisponibilité de certaines fonctionnalités.

Mais iOS Guide d’interface homme-machine pour démarrer et arrêter l’application , suggérant que Ne jamais utiliser le bouton Quitter ou Fermer pour mettre fin à l’application. Au lieu de cela, ils suggèrent d’afficher un message approprié pour expliquer la situation.

Une application iOS n’affiche jamais une option Fermer ou Quitter. Les gens cessent d’utiliser une application lorsqu’ils basculent vers une autre application, reviennent à l’écran d’accueil ou mettent leurs appareils en mode veille.

Ne quittez jamais une application iOS par programmation. Les gens ont tendance à interpréter cela comme un crash. Si quelque chose empêche votre application de fonctionner comme prévu, vous devez informer les utilisateurs de la situation et leur expliquer ce qu’ils peuvent faire.

En plus de ce qui précède, bon, réponse que je voulais juste append, pensez à nettoyer votre mémoire.

Une fois l’application fermée, l’iPhone OS nettoie automatiquement tout ce qui rest de votre application. Ainsi, libérer manuellement toute la mémoire peut simplement augmenter le temps nécessaire à la sortie de votre application.

Hm, vous devrez peut-être quitter l’application si, par exemple, votre application nécessite une connexion Internet. Vous pouvez afficher une alerte puis faire quelque chose comme ceci:

 if ([[UIApplication sharedApplication] respondsToSelector:@selector(terminate)]) { [[UIApplication sharedApplication] performSelector:@selector(terminate)]; } else { kill(getpid(), SIGINT); } 
 - (IBAction)logOutButton:(id)sender { //show confirmation message to user CustomAlert* alert = [[CustomAlert alloc] initWithTitle:@"Confirmation" message:@"Do you want to exit?" delegate:self cancelButtonTitle:@"Cancel" otherButtonTitles:@"OK", nil]; alert.style = AlertStyleWhite; [alert setFontName:@"Helvetica" fontColor:[UIColor blackColor] fontShadowColor:[UIColor clearColor]]; [alert show]; } - (void)alertView:(UIAlertView *)alertView clickedButtonAtIndex:(NSInteger)buttonIndex { if (buttonIndex != 0) // 0 == the cancel button { //home button press programmatically UIApplication *app = [UIApplication sharedApplication]; [app performSelector:@selector(suspend)]; //wait 2 seconds while app is going background [NSThread sleepForTimeInterval:2.0]; //exit app when app is in background NSLog(@"exit(0)"); exit(0); } } 

J’ai utilisé l’approche [[NSMutableArray new] addObject: nil] mentionnée ci-dessus pour quitter (arrêter) l’application sans effectuer d’appel de fonction de sortie (0).

Pourquoi? Parce que mon application utilise l’attachement de certificates sur tous les appels d’API réseau pour empêcher les attaques de type intermédiaire. Celles-ci incluent les appels d’initialisation que mon application financière effectue au démarrage.

Si l’authentification par certificate échoue, tous mes appels d’initialisation sont annulés et mon application rest dans un état indéterminé. Laisser l’utilisateur rentrer à la maison et revenir dans l’application n’aide pas, car à moins que l’application n’ait été purgée par le système d’exploitation, elle n’est toujours pas initialisée et n’est pas fiable.

Donc, dans ce cas, nous avons jugé préférable de faire apparaître une alerte pour informer l’utilisateur que l’application fonctionne dans un environnement non sécurisé, puis, quand ils cliquent sur «Fermer», ils doivent quitter l’application en utilisant la méthode susmentionnée.

Quitter une application autrement que le bouton d’accueil est une approche vraiment non-iOS .

J’ai fait cette aide, cependant, qui n’utilise aucun truc privé:

 void crash() { [[NSMutableArray new] addObject:NSSsortingngFromClass(nil)]; } 

Mais toujours pas pour la production dans mon cas. C’est pour tester les rapports de crash, ou pour redémarrer rapidement après une réinitialisation des données de base. Il suffit de faire en sorte de ne pas être rejeté si la fonction rest dans le code de production.

L’utilisateur doit décider quand une application se termine. Je ne pense pas que ce soit une bonne interaction avec l’utilisateur lorsqu’une application se ferme. Il n’y a donc pas de bonne API pour cela, seul le bouton d’accueil en a une.

S’il y a une erreur: Implémentez-le mieux ou Avertissez l’utilisateur. S’il doit y avoir un redémarrage: implémentez-le mieux dans Notifier l’utilisateur.

Cela peut sembler stupide, mais c’est une mauvaise pratique de quitter l’application sans laisser l’utilisateur décider et ne pas l’avertir. Et comme il y a un bouton d’accueil pour l’interaction de l’utilisateur, déclare Apple, il ne devrait pas y avoir 2 choses pour la même fonction (quitter une application).

Quitter une application autrement

J’ai fait cette aide, cependant, qui n’utilise aucun truc privé:

Sortie (0);

Il peut être approprié de quitter une application s’il s’agit d’une application de longue durée qui s’exécute également en arrière-plan, par exemple pour obtenir des mises à jour de l’emplacement (en utilisant la fonctionnalité d’arrière-plan des mises à jour d’emplacement ).

Par exemple, supposons que l’utilisateur se déconnecte de votre application basée sur la localisation et pousse l’application en arrière-plan à l’aide du bouton d’accueil. Dans ce cas, votre application peut continuer à fonctionner, mais il peut être judicieux de la quitter complètement. Ce serait bien pour l’utilisateur (libère de la mémoire et d’autres ressources qui n’ont pas besoin d’être utilisées), et bon pour la stabilité des applications (s’assurer que l’application est redémarrée périodiquement lorsque cela est possible) problèmes).

Cela pourrait (mais probablement ne devrait pas, voir ci-dessous 🙂 être réalisé avec quelque chose comme:

 - (void)applicationDidEnterBackground:(UIApplication *)application { if (/* logged out */) { exit(0); } else { // normal handling. } } 

Étant donné que l’application sortira alors de l’arrière-plan, l’utilisateur n’aura pas l’impression qu’elle ne ressemblera pas à un plantage, à condition que l’interface utilisateur soit restaurée lors de la prochaine exécution de l’application. En d’autres termes, pour l’utilisateur, il ne serait pas différent d’une terminaison de l’application lancée par le système lorsque l’application est en arrière-plan.

Cependant, il serait préférable d’utiliser une approche plus standard pour faire savoir au système que l’application peut être terminée. Par exemple, dans ce cas, en vous assurant que le GPS n’est pas utilisé en arrêtant les mises à jour de localisation demandées, y compris en désactivant l’affichage de la position actuelle sur une carte, le cas échéant. De cette façon, le système se chargera de terminer l’application quelques minutes (par exemple, [[UIApplication sharedApplication] backgroundTimeRemaining] ) après que l’application entre en arrière-plan. Cela aurait les mêmes avantages sans avoir à utiliser le code pour terminer l’application.

 - (void)applicationDidEnterBackground:(UIApplication *)application { if (/* logged out */) { // stop requesting location updates if not already done so // tidy up as app will soon be terminated (run a background task using beginBackgroundTaskWithExpirationHandler if needed). } else { // normal handling. } } 

Et bien sûr, utiliser exit(0) ne serait jamais approprié pour l’application de production moyenne qui s’exécute au premier plan, comme d’autres réponses qui font référence à http://developer.apple.com/iphone/library/qa/qa2008/qa1561. html

 [[UIApplication sharedApplication] terminateWithSuccess]; 

Cela a bien fonctionné et appelle automatiquement

 - (void)applicationWillTerminateUIApplication *)application delegate. 

pour supprimer l’avertissement de compilation, ajoutez ce code

 @interface UIApplication(MyExtras) - (void)terminateWithSuccess; @end