Besoin d'aide pour gérer les interruptions d'une app...

Mkdisco

Membre confirmé
27 Septembre 2010
10
0
Bonsoir,

Tout d'abord, ce message concerne le développement pour iPhone.

Je travaille sur une application qui une fois lancée a deux états, un état actif, avec une activité basée sur un timer qui tourne, et un état passif, lorsque le timer est arrété.

Mon but est de simuler le fait qu'une fois lancée, on ait l'impression que l'appli tourne en continue. C'est à dire que malgré toutes les interruptions possibles (veille, switch sur une autre app, tel entrant et sortant, extinction...), lorsque qu'on revient dessus on ait l'impression qu'elle n'a pas arrété de tourner au premier plan.

J'ai donc un dispositif avec des systèmes de sauvegarde sur plists pour quelques valeurs et booléens, système qui sauvegarde ce qu'il faut dans les méthodes du délégué d'application et qui récupère le tout dans mon viewWillAppear.

Seulement voilà, ça marche parfaitement sur iPhone 4 (simu+vrai tel) mais sur iPhone3 rien à faire.

Comment marchent les interruptions d'une appli sur iPhone3 ? N'aboutissent-elles pas toujours à un applicationWillTerminate ? Pourquoi le code équivalent à celui qui fait le boulot dans applicationDidEnterBackGround pour iPhone4 ne marche-t-il dans willTerminate pour un iPhone 3 ?

Peut-être parce qu'il faut le mettre autre part ? Le problème est que j'ai essayé il me semble toutes les méthodes du délégué concernant les différentes étapes de l'interruption d'une appli :cool:

Bref, pour que ça marche pour un iPhone 3, où dois-je mettre le code qui sauvegarde mes valeurs et données diverses que je récupère au lancement suivant ? Je suis vraiment paumé dans ces histoires de cycle de vie d'une appli, à vue de nez quelqu'un pourrait-il m'aiguiller ?

Merci d'avance et beaucoup :D
 
L'iPhone 3 sur lequel je fais mes essais infructueux a la dernière version de l'OS installée.

Par ailleurs, justement mon but est de ne pas bénéficier du multitasking pour que l'appli fonctionne sur le plus de machines possible.

En effet, en quittant le premier plan, l'appli continuera de tourner sur les machines qui le supportent (quoi qu'on ne maîtrise pas ce qui se passe quand l'appli est en background, elle peut très bien être arrêtée sous certaines conditions...) mais elle s'arrêtera sur les autres...

Donc, dès que l'aplli quitte le premier plan je veux sauvegarder ce qu'il faut pour qu'à son prochain démarrage, ou prochain retour au premier plan, elle tourne comme si elle n'en avait jamais bougé.

Peut-être que j'interprête mal ce qui se passe dans mes tests, peut-être que je comprends mal les étapes de l'interruption de l'appli ou de son cycle de vie en général. Et sûrement les deux en même temps :D. Je vais donc retourner dans les fondamentaux de cocoa/ios comme me le suggère prolixement Tatouille. Mais si vous avez des tuyaux, merci d'avance !
 
Dernière édition:
D'après la doc, si ton appli supporte le multitâche, -[applicationDidEnterBackground:] est toujours appelée sous iOS 4. -[applicationWillTerminate:] n'est appelée qu'en cas de problème.

Il se peut que ton appli monopolise de grosses quantités de mémoire, et ne la libère pas quand l'OS lui réclame. Dans ce cas, l'OS va la quitter par un -[applicationWillTerminate]. Ceci pourrait expliquer la différence entre un iPhone 3GS et un iPhone 4 qui dispose de 2x plus de RAM, il me semble.

(Je jure pas que c'est ça, mais c'est une explication. Un petit coup d'Instruments pour vérifier).
 
Merci de ta réponse Céroce.

Je ne pense pas qu'il y ait de problème de mémoire. D'une l'appli est très légère et j'ai réussi à la faire tourner des heures. Plus prosaiquement, je pense que Tatouille est plus dans le vrai. Suite à une question que j'avais posé ici il y a six mois, je crois qu'il m'avait répondu, en gros, de lacher xCode et de me mettre au ping-pong. Il a su détecté à mes questions le nioub qui est en moi et qui se plante sur les fondamentaux...

Je crois que si mon app marche sur le simu et un iPhone4, ce n'est peut-être à cause de mon génial système de sauvegarde-récupération, mais tout simplement parce qu'elle ne s'arrête pas de tourner (et qu'avant si elle marchait pas c'est parce que mes réinit étaient foireuses...).

En fait je ne maitrise pas le cycle de vie des apps.
Je dois être paumé dans les différents événements et leur conséquences sur l'app, etc.
 

Merci, lien très utile en effet...
Comme je suis un relou, je trouve qu'il manque quand même dedans tous les autres appels de méthodes... :D Et le cas de l'iPhone 3 avec l'OS4 réserve quelques surprise aussi.
Mais bon, il m'a bien aidé. Mon problème était en effet de connaître les différents enchainements et d'avoir un code adapté. Un gros boxon quoi :D

Il me reste par contre encore un problème...

Mon appli, quand elle est lancée, a un timer en route et un son qui tourne en boucle. Quand je la tue (bouton home sur un iPhone3 cad ---> app terminated) et que je la relance immédiatement (elle est sensée revenir "en marche" avec le timer et le son qui tournent à nouveau...), le lancement foire. Alors qu'il me semble qu'en attendant quelques secondes ça revient normalement.

Serait-il possible que cela soit du à des contraintes ou des limites hardware ?

Merci de votre attention !