Question

Je suis la programmation d'une application iPhone, et je dois le forcer à quitter en raison de certaines actions de l'utilisateur. Après le nettoyage de la mémoire allouée à l'application, ce qui est la méthode appropriée pour appeler de mettre fin à l'application?

Était-ce utile?

La solution

Avez-vous essayé exit(0)?

Sinon, [[NSThread mainThread] exit], bien que je ne l'ai pas essayé, il semble que la solution la plus appropriée.

Autres conseils

Sur l'iPhone il n'y a pas de concept de quitter une application. La seule action qui devrait provoquer une application à quitter est en contact avec le bouton Home sur le téléphone, et ce n'est pas les développeurs ont accès à quelque chose.

Selon Apple, votre application ne devrait pas mettre fin à lui-même. Étant donné que l'utilisateur n'a pas touché le bouton Home, tout retour à l'écran d'accueil donne à l'utilisateur l'impression que votre application est écrasé. Ceci est source de confusion, comportement non standard et devrait être évitée.

exit (0) semble un utilisateur comme plante, donc montrer un message de confirmation à l'utilisateur. Après confirmation d'interruption (appuyez sur le bouton d'accueil par programmation) et attendre 2 secondes pendant que l'application va arrière-plan avec animation puis la sortie derrière 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 ne 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];

Vérifier le Q & A ici: https://developer.apple.com /library/content/qa/qa1561/_index.html

  

Q: Comment puis-je quitter mon programme application iOS

     

Il n'y a pas d'API fourni pour terminer avec grâce une application iOS.

     

Dans iOS, l'utilisateur appuie sur le bouton principal pour fermer les applications. Si votre demande a des conditions dans lesquelles il ne peut pas fournir sa fonction, l'approche recommandée est d'afficher une alerte pour l'utilisateur qui indique la nature du problème et les actions possibles, l'utilisateur peut prendre - allumer WiFi, permettant la localisation des services, etc. permettre à l'utilisateur de mettre fin à l'application à leur propre discrétion.

     
    

ATTENTION: Ne pas appeler la fonction exit. Les demandes d'appel apparaît à -applicationWillTerminate: l'utilisateur d'avoir écrasé, plutôt que d'effectuer une terminaison gracieuse et animant à l'écran d'accueil.

  
     

En outre, les données ne peuvent pas être enregistrées, car les méthodes et de UIApplicationDelegate similaires ne seront pas abort être invoquée si vous appelez la sortie.

     

Si au cours du développement ou l'essai, il est nécessaire de mettre fin à votre application, la fonction assert ou macro est recommandé <=>

Accédez à votre info.plist et vérifiez la clé « application ne fonctionne pas en arrière-plan ». Cette fois-ci lorsque l'utilisateur clique sur le bouton d'accueil, l'application se ferme complètement.

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

Après quelques tests, je peux dire ce qui suit:

  • en utilisant l'interface privée: provoquera l'[UIApplication sharedApplication] application ressemblant est écrasé, mais il appellera avant de le faire - (void)applicationWillTerminate:(UIApplication *)application;
  • à l'aide prendra également fin exit(0); l'application, mais il regardera « normal » (les icônes du tremplin apparaît comme prévu, avec le zoom en effet), mais il ne sera pas appeler la méthode déléguée <=>.

Mon conseil:

  1. appeler manuellement le délégué sur le <=>.
  2. Appel <=>.

Votre ApplicationDelegate est notifié d'arrêter de fumer intentionnelle par l'utilisateur:

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

Quand je reçois cette notification que je viens d'appeler

        exit(0);

Ce qui fait tout le travail. Et la meilleure chose est, il est l'intention de useres arrêter de fumer, ce qui est la raison pour laquelle cela ne devrait pas être un problème d'appeler là.

Sur mon Audio-App il était nécessaire de quitter l'application après que les gens ont été synchronisent leur appareil tandis que la musique jouait encore. Dès que la synchronisation est terminée, je reçois une notification. Mais quitter l'application juste après regarderait vraiment comme un accident.

Ainsi, au lieu que je mis un drapeau pour vraiment arrêter l'application sur l'action suivante de semi-. Ce qui est correct pour rafraîchir l'application après une synchronisation.

My App a été rejetée récemment bc je l'ai utilisé une méthode non documentée. Littéralement:

"Malheureusement, il ne peut pas être ajouté à l'App Store parce qu'il utilise une API privée d'API non publiques, qui, comme indiqué dans la section Contrat de licence du programme développeur iPhone 3.3.1 est interdite.

« 3.3.1 Applications ne peuvent utiliser que les API documentées dans la manière prescrite par Apple et ne doit pas utiliser ou appeler des API privées. »

L'API non publiques qui est inclus dans votre application est terminateWithSuccess "

Apple dit:

« Attention:.. Ne pas appeler la fonction de sortie Applications appelant sortie apparaîtront à l'utilisateur d'avoir écrasé, plutôt que d'effectuer une terminaison gracieuse et animant à l'écran d'accueil »

Je pense que cela est une mauvaise prise en charge. Si l'utilisateur appuyez sur un bouton et quitter un message apparaît que dire quelque chose comme: «L'application va quitter maintenant », il ne semble pas être écrasé. Apple devrait fournir un moyen valable de quitter une application (non sortie (0)).

a obtenu une bonne réponse, mais a décidé de développer un peu:

Vous ne pouvez pas obtenir votre demande acceptée à l 'AppleStore sans lire Human Interface Guidelines iOS d'Apple bien. (Ils conservent le droit de vous refuser de le faire quoi que ce soit contre eux) La section « Ne quittez pas Programmatically » http://developer.apple.com/library/ios/#DOCUMENTATION/UserExperience/Conceptual/MobileHIG/UEBestPractices/UEBestPractices.html est une ligne directrice précise dans la façon dont vous devez traiter dans ce cas.

Si jamais vous avez un problème avec la plate-forme Apple, vous ne pouvez pas trouver facilement une solution, consultez HIG. Il est possible qu'Apple ne veut tout simplement pas vous le faire et ils en général (je je ne suis pas d'Apple ne peut donc pas garantir toujours) ne le dire dans leur documentation.

Nous ne pouvons pas quitter l'application à l'aide, exit(0) fonctions abort(), comme Apple a fortement l'utilisation découragea de ces fonctions. Bien que vous pouvez utiliser ces fonctions pour le développement ou le but de tester.

  

Si au cours du développement ou de test, il est nécessaire de mettre fin à votre   l'application, la fonction abort ou macro assert est recommandé

S'il vous plaît trouver cette Q & A pour obtenir plus d'informations .

L'utilisation de cette fonction crée l'impression que l'application se bloque. Donc, je suis une suggestion que nous pouvons afficher un message d'alerte avec de terminaison à l'utilisateur au courant de la fermeture de l'application, en raison de l'indisponibilité de certaines fonctionnalités.

Mais iOS humain Directive Interface pour Démarrage et arrêt App , ce qui suggère que Ne jamais utiliser Quitter ou bouton Fermer de mettre fin à l'application. Plutôt alors qu'ils proposent pour afficher un message propre à expliquer la situation.

  

Une application iOS affiche jamais Fermer ou Quitter option. Les gens cessent d'utiliser un   application quand ils passent à une autre application, revenir à l'écran d'accueil, ou mettre   leurs appareils en mode veille.

     

Ne jamais quitter une application iOS programme. Les gens ont tendance à interpréter cette   comme un accident. Si quelque chose empêche votre application de fonctionner comme   prévu, vous devez indiquer aux utilisateurs sur la situation et expliquer   ils peuvent le faire à ce sujet.

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

Après votre sortie de l'application, l'iPhone OS nettoie automatiquement quoi que ce soit votre application laissé derrière lui, libérant ainsi toute la mémoire manuellement peut simplement augmenter la quantité de temps qu'il faut votre demande pour quitter.

Hm, vous pouvez « devoir » quitter l'application si, par exemple, votre application nécessite une connexion Internet. Vous pouvez afficher une alerte et 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é le [[NSMutableArray nouveau] addObject: néant] approche mentionnée ci-dessus pour forcer-quit (accident) l'application sans faire une sortie tell-tale (0) appel de fonction

.

Pourquoi? Parce que mon application utilise épinglage certificat sur toutes les API de réseau appelle à prévenir les attaques man-in-the-middle. Ceux-ci comprennent l'initialisation appelle mon application financière fait au démarrage.

Si l'authentification échoue de certificat, tout mon initialisation appelle erreur et laissez mon application dans un état indéterminé. Laisser l'utilisateur rentrer à la maison, puis de nouveau dans l'application ne fonctionne pas, comme à moins que l'application a été purgée par le système d'exploitation, il est toujours non initialisée et indigne de confiance.

Alors, dans ce cas particulier, nous avons jugé préférable de pop une alerte informant l'utilisateur que l'application fonctionne dans un environnement non sécurisé, puis, quand ils ont frappé « Fermer », la force quitter l'application en utilisant la méthode ci-dessus.

[[UIApplication sharedApplication] terminateWithSuccess];

Il a bien fonctionné et appelle automatiquement

- (void)applicationWillTerminateUIApplication *)application delegate.

pour supprimer avertissement compilation ajouter ce code

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

L'utilisateur doit décider quand un sort app. Je ne pense pas que ce soit une bonne interaction de l'utilisateur lorsqu'une application se ferme. Par conséquent, il n'y a pas d'API agréable pour elle, seul le bouton d'accueil a un.

S'il y a une erreur: Mettre en oeuvre ou mieux prévenir l'utilisateur. S'il doit y avoir un redémarrage. Mettre en œuvre mieux d'informer l'utilisateur

Il semble stupide, mais il est une mauvaise pratique pour quitter l'application sans laisser l'utilisateur décider et non l'avertir. Et comme il y a un bouton d'accueil pour l'interaction de l'utilisateur, Apple affirme, il ne devrait pas être 2 choses pour la même fonction (une application) sortant.

Quitter une application autre manière que le bouton d'accueil est vraiment non-iOS-esque approche.

Je l'ai fait cette aide, cependant, que vous n'utilisez des choses privées:

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

Mais pas encore destiné à la production dans mon cas. Il est pour tester reportings crash, ou redémarrage rapide après une réinitialisation des données de base. Juste fait sûr de ne pas être rejeté si la fonction laissée dans le code de production.

Swift 4.2 (ou plus)

Bibliothèque appelée peut être utilisé Darvin.

import Darwin

exit(0) // Here you go

NB: Ce ne recomanded dans les applications iOS.

Faire cela vous obtenir Crashlog.

Vous ne devez pas appeler directement la fonction car il exit(0) quitter l'application immédiatement et ressemblera votre application est écrasé. Il vaudrait donc mieux pour montrer aux utilisateurs une alerte de confirmation et de les laisser faire eux-mêmes.

Swift 4.2

func askForQuit(_ completion:@escaping (_ canQuit: Bool) -> Void) {
    let alert = UIAlertController(title: "Confirmation!", message: "Do you want to quit the application", preferredStyle: .alert)
    alert.addAction(UIAlertAction(title: "Yes", style: UIAlertAction.Style.default, handler: { (action) in
        alert.dismiss(animated: true, completion: nil)
        completion(true)
    }))
    alert.addAction(UIAlertAction(title: "No", style: UIAlertAction.Style.cancel, handler: { (action) in
        alert.dismiss(animated: true, completion: nil)
        completion(false)
    }))
    self.present(alert, animated: true, completion: nil)
}

/// Will quit the application with animation
func quit() {
    UIApplication.shared.perform(#selector(NSXPCConnection.suspend))
    /// Sleep for a while to let the app goes in background
    sleep(2)
    exit(0)
}

Utilisation:

self.askForQuit { (canQuit) in
     if canQuit {
         self.quit()
     }
}

Quitter une application autre façon

Je l'ai fait cette aide, cependant, que vous n'utilisez des choses privées:

Exit (0);

Il peut être approprié pour quitter une application si elle est une application longue durée de vie qui exécute aussi en arrière-plan, par exemple pour obtenir des mises à jour de localisation (en utilisant les Mises à jour l'emplacement capacité d'arrière-plan pour cela).

Par exemple, supposons que l'utilisateur se connecte sur votre application géolocalisée et pousse l'application à l'arrière-plan à l'aide du bouton d'accueil. Dans ce cas, votre application peut continuer à courir, mais il pourrait être judicieux de sortir complètement. Il serait bon pour l'utilisateur (libère la mémoire et d'autres ressources qui ne doivent être utilisés), et bon pour la stabilité de l'application (par exemple en vous assurant que l'application est régulièrement redémarré lorsque cela est possible est un filet de sécurité contre les fuites de mémoire et d'autres peu de mémoire problèmes).

Cela pourrait (mais ne devrait probablement pas, voir ci-dessous :-) atteindre avec quelque chose comme:

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

Depuis l'application serait alors sortie de l'arrière-plan il ne sera pas mal à l'utilisateur, et ne ressemblera pas à un accident, fournissant l'interface utilisateur est restauré la prochaine fois qu'ils exécutent l'application. En d'autres termes, l'utilisateur ne serait pas l'air différent à un système initié fin de l'application lorsque l'application est en arrière-plan.

Pourtant, il serait préférable d'utiliser une approche plus standard pour que le système sache que l'application peut être mis fin. Par exemple, dans ce cas, en veillant à ce que le GPS n'est pas utilisé par l'arrêt demandant des mises à jour de l'emplacement, y compris désactivant montrer l'emplacement actuel sur une vue carte si elle est présente. De cette façon, le système se chargera de mettre fin à l'application quelques minutes (à savoir [[UIApplication sharedApplication] backgroundTimeRemaining]) après l'application entre l'arrière-plan. Cela obtiendrait tous les mêmes avantages sans avoir à utiliser le code pour mettre fin à 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, à l'aide ne serait jamais exit(0) approprié pour l'application de la production moyenne qui passe au premier plan, comme pour les autres réponses qui font référence http://developer.apple.com/iphone/library/qa/qa2008/qa1561.html

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top