applicationWillTerminate quand est-il appelé et quand ne pas
Salut j'ai lu à plusieurs questions sur DONC environ applicationWillTerminate appelé et ne pas avoir appelé.
Je voulais résumer ce que j'ai compris qu'il y a plusieurs posts qui parlent différemment.
-
Pour IOS (sans le multitâche), il est appelé toujours lorsque le bouton est pressé.
-
Pour IOS 4 et au-dessus de
un. il est pas appelé lors de l'appui sur bouton home (comme l'application se déplace de l'arrière-plan)
b. elle est appelée lors de la fermeture de l'application à partir du multi-tâches dock et si l'application a un coup de résilier le drapeau en info.plist désactivé autre chose, elle n'est pas appelée. ( J'ai mis le "formulaire de Demande doit obtenir l'Application est Mort événements" et même alors, sur la fermeture de l'application dans le dock multitâche mettre fin à la fonction n'a pas appelé)
Basés sur que j'ai eu un couple de questions
Est-il une bonne pratique de l'Application doit obtenir l'Application est Mort événements drapeau? ( J'ai mis le "formulaire de Demande doit obtenir l'Application est Mort événements" et même alors, sur la fermeture de l'application dans le dock multitâche mettre fin à la fonction n'a pas appelé)
ou
Est l'enregistrement de "UIApplicationWillTerminateNotification" chose de mieux à faire que de l'info.plist la mise en?
Essentiellement, j'ai besoin de faire un peu de travail seulement lorsque l'application se termine et PAS quand il se déplace à l'arrière-plan.
ou
MODIFIER (1):
Lorsque l'application est terminée le suivant est envoyé à l'APPLICATION. Comment puis-je rattraper?
Programme du signal reçu: “SIGKILL”.
EDIT (2):
Veuillez noter : Il n'est pas appelé dans IOS 4 et ci-dessus lors de la suppression de la dock multitâche. Vous pourriez penser qu'il est. Mais dans mon cas, il ne l'est pas.
Je demande si quelqu'un sait pourquoi? Est-il autre chose que je suis absent.
Notez aussi j'ai mis le "Application doit obtenir l'Application est Mort événements" et même alors, il n'est pas appelé.
MODIFIER (3):
La réponse à la question suivante aussi n'a pas de travail.
applicationWillTerminate n'a pas appelé
Personne confrontée au même problème que moi?
- J'ai le même problème. Une remarque: vous ne pouvez pas attraper de SIGKILL, ce signal est traité par le système d'exploitation et est l'équivalent de la suppression de toutes les ressources de l'application (donc pas moyen de votre application pour attraper ce signal).
- merci pour cela. On revient donc à trouver comment faire "applicationWillTerminate" dans IOS 4 et au-dessus.
Vous devez vous connecter pour publier un commentaire.
En bref, sauf si vous avez
UIApplicationExitsOnSuspend
dans votre Info.plist défini à OUI, en iOS4 et au-dessus il n'y a aucune garantie queapplicationWillTerminate:
aurai jamais appelé.Comme la documentation dit:
(C'est moi qui souligne.)
Si vous avez besoin de faire quelque chose avant que l'application s'arrête, vous devez le faire à
applicationDidEnterBackground:
. Il n'y a aucun moyen de les attraper SIGKILL.Je vois
-applicationWillTerminate:
appelé avec le test suivant. Dans un nouveau projet (j'ai utilisé du " Single View Application d'un modèle), ajoutez le code suivant à l'AppDelegate:Cet exemple va commencer une tâche en arrière-plan lors de l'app entre l'arrière-plan. La tâche est juste une 20s de retard (avec ouverture de session une fois par seconde) qui maintient l'application qui s'exécute en arrière-plan (notez la différence entre le cours d'exécution en arrière-plan et suspension), assez longtemps pour lui permettre d'être tué à partir de l'app switcher.
Donc, pour le tester, lancer l'application, cliquez le bouton de la maison pour envoyer l'app en arrière plan, puis avant l'20s de retard est en place, retirez-le de l'app switcher. Après la fin des années 20,
-applicationWillTerminate:
est appelé. Vous pouvez regarder la console de Xcode pour vérifier que c'est le cas.J'ai essayé ceci dans le Simulateur iOS pour iOS 5.1 et 6.1 (iPhone) et vu cela se produire dans les deux cas. J'ai aussi testé sur iPhone 4S iOS 6.1.2 et vu le même comportement.
-applicationWillTerminate:
est appelé, ni est-il garanti d'être exhaustive. De même, je trouve qu'il est utile de savoir qu'il est possible pour elle d'être appelé, même dans les applications qui prennent en charge exécution en arrière-plan.-applicationWillTerminate:
n'arrive jamais, si vous supprimez le-applicationDidEnterBackground:
(testé avec iOS 7.1). Que fait un certain sens, une application avec un arrière-plan d'exécution de tâche pourrait utiliser le...willTerminate:
message à la fin de sa tâche en arrière-plan; une application sans ces tâches n'a pas besoin de le faire.applicationWillTerminate:
est appelé, quel que soit il y a une tâche d'arrière-plan ou non. Mais, si vous cliquez sur le bouton de la Maison qu'une seule fois, et rendre l'application aller dans le fond d'abord, puis double-cliquez sur bouton d'Accueil, balayez vers le haut et de tuer l'application plus tard,applicationWillTerminate:
sera appelée que si il y a processus d'arrière-plan est en cours. Sinon, il ne sera pas appelé.Que je sais, il y a 3 situations que votre application va mourir.
Résilié par l'utilisateur final, vous pouvez faire quelque chose dans
-[UIApplication applicationWillEnterBackground:]
, dans ce cas,-[UIApplication applicationWillTerminate:]
ne sera PAS appelé.Abandonnés par le système, telles que la mémoire ne suffit pas, vous pouvez faire quelque chose dans
-[UIApplication applicationWillTerminate:]
, dans ce cas, nous ne savons PAS siapplicationWillEnterBackground:
a été appelé;S'est écrasé, rien ne peut être fait exception à l'aide de une sorte de rapport d'incident de l'Outil. (Édité: attraper
SIGKILL
est impossible)Source: http://www.cocos2d-iphone.org/forum/topic/7386
Que nous savons que l'Application ne dispose que de 5 sec quand
-applicationWillTerminate
d'être appelé. Donc Si quelqu'un veux mettre à jour le serveur à ce point. Que d'utiliserAppel synchrone.
Remarque:-
-applicationWillTerminate
n'ira pas en appel si l'application est en train d'être tués depuis l'état de veille. Suspendu de l'état moyen de l'app ne fonctionne pas rien dans backgroupd. L'une des solution pour cela est d'utiliser tâche de fond.//réponse absolue applicationWillTerminate
func applicationWillTerminate(application: UIApplication) {
étape 1: commande + maj + h (double-cliquez sur(tab))
étape 2: move app côté supérieur (tuer)
étape 3: applicationWillTerminate Travail