Terminer une app en background

happybikerhappybiker 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

Réponses

  • CéroceCéroce Membre, Modérateur
    10:56 modifié #2
    Tu ne peux pas. Au mieux, tu pourrais avoir un autre processus qui surveille ton application, mais ça ma paraà®t infaisable sur iOS.
    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) ?

  • happybikerhappybiker Membre
    10:56 modifié #3
    Merci pour ta réponse, mais désolé de te contredire, mais l'application reçoit le signal SIGKILL et est donc bien killée. Apparemment, selon la doc, je n'ai aucun moyen de savoir quand ce SIGKILL est envoyé.

  • CéroceCéroce Membre, Modérateur
    10:56 modifié #4
    Effectivement, je viens de faire l'essai, et l'application reçoit un kill sans que la méthode déléguée soit appelée.

    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.
  • happybikerhappybiker Membre
    10:56 modifié #5
    La question est simple, comment être notifié d'un SIGKILL.
    Ceci dit, il semble que si on utilise le service core location, il y aurait peut-être moyen.

    Je regarde.

    HP
  • AliGatorAliGator Membre, Modérateur
    10:56 modifié #6
    La doc Apple indique clairement que quand on passe en background, on doit s'attendre à  être killé sans être prévenu à  tout moment (en particulier si un autre appli emet au système une alerte de MemoryWarning).

    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 ?
  • happybikerhappybiker Membre
    10:56 modifié #7
    Merci pour ta réponse mais je vais faire simple. Je vais faire en sorte que mon client change d'avis.

    Happybiker
  • zoczoc Membre
    10:56 modifié #8
    C'est une bonne décision, sachant que de toute façon SIGKILL n'est pas interceptable.

  • AliGatorAliGator Membre, Modérateur
    10:56 modifié #9
    Ah oui tiens j'avais oublié ce détail, bien vu zoc :)
  • devulderdevulder Membre
    10:56 modifié #10
    dans 1286556811:

    C'est une bonne décision, sachant que de toute façon SIGKILL n'est pas interceptable.


    Objection votre honneur ! voir ici

    Enfin si j'ai bien compris :)


  • zoczoc Membre
    10:56 modifié #11
    dans 1286573160:

    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).
Connectez-vous ou Inscrivez-vous pour répondre.