Terminer une app en background
happybiker
Membre
Bonjour à tous,
Ma question est simple. Y a t'il un moyen de savoir quand une application est terminée lorsqu'elle est en background ?
Je m'explique.
J'ai une app en 4.1. Cette application se connecte à un serveur qui met un flag dans une db lorsque l'utilisateur est connecté. Ce flag est important pour le bon déroulement de l'app chez les autres utilisateurs.
Mon client veut que l'app soit multitâches (c'est-à -dire qu'elle reste en background lorsqu'il appuie sur le bouton Home).
Si je comprend bien le mécanisme, lorsque l'utilisateur appuie sur le bouton home, l'application est en background et la méthode applicationEnterBackground est appelée. Mais, si l'utilisateur kill l'application depuis la barre des tâches, aucune méthode n'est appelée et donc impossible de mettre le flag connecté à FALSE dans mon serveur.
Par quel moyen je peux savoir si l'application est killée ou pas ?
Merci de votre aide.
Happybiker
Ma question est simple. Y a t'il un moyen de savoir quand une application est terminée lorsqu'elle est en background ?
Je m'explique.
J'ai une app en 4.1. Cette application se connecte à un serveur qui met un flag dans une db lorsque l'utilisateur est connecté. Ce flag est important pour le bon déroulement de l'app chez les autres utilisateurs.
Mon client veut que l'app soit multitâches (c'est-à -dire qu'elle reste en background lorsqu'il appuie sur le bouton Home).
Si je comprend bien le mécanisme, lorsque l'utilisateur appuie sur le bouton home, l'application est en background et la méthode applicationEnterBackground est appelée. Mais, si l'utilisateur kill l'application depuis la barre des tâches, aucune méthode n'est appelée et donc impossible de mettre le flag connecté à FALSE dans mon serveur.
Par quel moyen je peux savoir si l'application est killée ou pas ?
Merci de votre aide.
Happybiker
Connectez-vous ou Inscrivez-vous pour répondre.
Réponses
Ceci dit, quand l'utilisateur ferme l'appli, je ne pense pas qu'elle recoive un kill (ce n'est pas une manière propre de terminer un processus), elle doit recevoir un ordre de fermeture, et la méthode déléguée de UIApplication applicationWillTerminate: est certainement appelée.
Tu as un problème de conception:
- que se passe-t-il si ton appli plante ?
- que se passe-t-il si l'iPhone ne peut plus rester connecté (perte du réseau) ?
Si l'appli n'est pas au 1er plan, on peut admettre que l'utilisateur n'est pas connecté, mais ça ne règle pas tous les problèmes.
Ceci dit, il semble que si on utilise le service core location, il y aurait peut-être moyen.
Je regarde.
HP
Après, il est peut-être possible d'installer un signal handler (voir la page "man" de "signal" & co, c'est du C de base) pour déclencher une fonction quand on reçoit un SIGKILL et agir en conséquence, mais à ce moment là du cycle de vie de l'appli on est plus sensé avoir le temps de faire quoi que ce soit... donc encore moins une requête réseau asynchrone.
Le mieux est peut-être plutôt que tu fasses un polling régulier quand tu es en tâche de fond par exemple ? Genre envoyer toutes les N minutes à ton serveur pour lui dire "je suis toujours vivant".
Ceci dit quand on application est en background, elle ne peux plus agir normalement (sa RunLoop est mise en pause, il n'y a plus aucune action ou aucun code qui est exécuté avant qu'elle ne soit remise au premier plan), à part éventuellement les actions de background limitées que tu peux lui faire faire (terminer un download ou un upload, jouer du son, les trucs autorisés quoi)... du coup à quoi ça sert de garder le flag "up" dans ce cas ?
Happybiker
Objection votre honneur ! voir ici
Enfin si j'ai bien compris
Il fallait lire l'article en entier :
[color=rgb(51, 51, 51)]There are two signals which cannot be caught: [/color]SIGKILL and SIGSTOP. These are sent to your application to end it or suspend it without notice (a SIGKILL is what is sent by the command-line function kill -9 if you're familiar with that and a SIGSTOP is sent by typing Control-Z in a terminal).