Enregistrer le GPS en arrière-plan sur iOS sans perdre la sortie
iOS peut suspendre ou tuer votre enregistreur à tout instant, sans vous devoir le moindre avertissement. Ce que cela implique pour une app censée noter où vous êtes passé, et ce qui protège réellement une sortie.
Vous lancez un enregistrement, glissez le téléphone dans une poche, roulez trois heures, le ressortez, et l’app affiche vingt minutes. C’est la plainte sérieuse la plus fréquente à propos des traqueurs sur téléphone, et la cause n’est presque jamais le GPS.
Ce qu’iOS fait réellement à votre app
Une app iOS en arrière-plan ne tourne pas simplement plus lentement. Elle traverse des états : encore en exécution, suspendue (figée en mémoire, n’exécutant rien) et terminée (disparue). Le système vous fait passer de l’un à l’autre selon la pression mémoire, l’état thermique, la batterie et son propre jugement, et il n’est pas tenu de vous prévenir à l’avance.
Une app dotée du mode d’arrière-plan de localisation a le droit de continuer à s’exécuter tant que des mises à jour de position arrivent, ce qui est la raison pour laquelle tout ceci fonctionne. C’est une garantie forte comparée à une app ordinaire. Ce n’est pas une garantie absolue : sous une vraie pression mémoire — un gros jeu, une app photo, un téléphone avec moins de mémoire vive — votre enregistreur peut malgré tout être tué en pleine sortie.
C’est de là que vient la défaillance qui compte. Si l’app gardait la sortie en mémoire en attendant que vous appuyiez sur stop avant d’écrire quoi que ce soit, alors tout ce qui s’est passé depuis la dernière sauvegarde est perdu. Pas corrompu. Perdu, sans la moindre erreur, parce que le processus qui était au courant n’existe plus.
La seule vraie protection : écrire au fil de l’arrivée
Il n’existe aucune astuce pour contourner cela. La protection consiste à ne jamais avoir de données non enregistrées.
Dans Roam, un appel de localisation est un lot, et un lot est une transaction en base ; les points et les totaux courants de la sortie sont validés ensemble. Aucun tampon n’attend la fin de la sortie, et il n’existe dans l’écriture aucun chemin qui laisse tomber un point en silence — un lot qui ne peut pas être validé lève une erreur et se range dans une alarme au lieu d’être absorbé. Si l’app est tuée au quarantième kilomètre, le quarantième kilomètre est déjà sur le téléphone.
Valider les totaux dans la même transaction que les points compte plus qu’il n’y paraît. Cela veut dire que la ligne de résumé ne peut jamais décrire un ensemble de points qui n’est pas sur le disque : après un arrêt brutal, il n’existe donc aucune fenêtre où les deux se contredisent — et la reprise n’a pas besoin de rejouer vingt-huit mille points pour retrouver où vous étiez. Elle lit la ligne.
L’autre moitié de la même idée : rien n’est jamais supprimé. Le filtrage, le lissage et la pause automatique ne retirent jamais une ligne de la base. Ils sont consignés sous forme d’indicateurs sur le point, et le flux brut reste exactement tel qu’il est arrivé, de sorte que, lorsqu’une heuristique se trompe sur une vraie sortie, les échantillons d’origine sont toujours là pour en redériver une meilleure trace. Une app qui jette discrètement les échantillons avec lesquels elle n’était pas d’accord a détruit la preuve qu’elle avait tort.
Se relever après une terminaison
Si vous avez accordé la localisation en mode Toujours, iOS peut relancer en arrière-plan une app terminée lorsqu’un changement significatif de position se produit. C’est une vraie bouée de sauvetage, et elle s’accompagne d’un piège qui a fait beaucoup de victimes parmi les enregistreurs.
Lors de cette relance, l’app dispose d’une fenêtre très courte et imprévisible avant que le système puisse la suspendre de nouveau — et surtout, elle peut être suspendue à n’importe quel point de suspension, ce qui, en Swift moderne, veut dire à n’importe quel await. Une app qui se relance puis charge de façon asynchrone un peu d’état avant de reconstruire son gestionnaire de localisation peut être figée en cours de route, et un processus suspendu avant d’avoir réarmé n’entendra plus jamais parler du GPS. Il a l’air de tourner. Il ne reçoit rien.
Le réarmement de Roam est délibérément synchrone pour exactement cette raison : la reconstruction du gestionnaire de localisation et le redémarrage des mises à jour ont lieu avant le premier await, ce qui rend l’erreur impossible à introduire plutôt que simplement déconseillée. Il est aussi écrit pour pouvoir être appelé deux fois sans dommage, parce qu’une relance en arrière-plan qui court après un lancement au premier plan fera précisément cela.
Soyons clairs : Toujours est une assurance, pas une obligation. L’enregistrement fonctionne très bien avec « Lorsque l’app est active », et l’app le dit dans la demande d’autorisation au lieu de laisser croire qu’il faut céder l’autorisation la plus large.
Et c’est une assurance plutôt qu’une garantie, distinction sur laquelle il vaut la peine d’insister. La configuration de Roam énonce l’hypothèse en toutes lettres : il se peut qu’elle ne soit jamais relancée, et la durabilité est la seule promesse qu’elle fait. Rien dans iOS n’oblige le système à ramener une app terminée. Ce qui s’est passé entre l’arrêt et la relance n’a été enregistré par personne, et aucune API ne peut le fournir après coup : ce que vous récupérez, c’est la sortie jusqu’à l’arrêt plus la sortie après la relance, avec un trou honnête entre les deux. Toute app qui décrit cela comme une continuité sans couture décrit quelque chose que la plateforme ne fournit pas.
Ce que le cycliste peut faire
- Accordez la localisation en mode Toujours si vous enregistrez quelque chose de long. C’est la différence entre une terminaison qui ne vous coûte rien et une terminaison qui vous coûte le reste de la sortie.
- Laissez le mode économie d’énergie désactivé si vous le pouvez. Il rend plus probable que le travail en arrière-plan soit écourté.
- Ne balayez pas l’app hors du sélecteur d’apps en pleine sortie. Une fermeture forcée dit à iOS que c’était voulu, et aucune relance en arrière-plan n’aura lieu.
- Ne faites pas tourner deux enregistreurs en même temps. Deux apps qui maintiennent le GPS éveillé doublent la consommation et la pression mémoire qui finit par en faire tuer une.
- Vérifiez l’autorisation après une mise à jour d’iOS. Il arrive qu’une mise à niveau rétrograde Toujours en « Lorsque l’app est active » sans grande cérémonie.
Comment savoir si votre enregistreur est sûr
Vous pouvez tester cela en dix minutes sans aucun outil particulier. Lancez un enregistrement, marchez cinq minutes, puis forcez la fermeture de l’app depuis le sélecteur d’apps et rouvrez-la. Si les cinq minutes sont là, l’app écrivait au fil de l’eau. Si la sortie est vide ou tronquée, elle gardait vos données en mémoire, et vous savez maintenant exactement ce que vous risquez de perdre sur une longue sortie.
Un enregistreur devrait par ailleurs déclarer le moins de choses possible. Chaque mode d’arrière-plan supplémentaire est un motif de terminaison en cas d’usage abusif et une question de plus posée par un examinateur de l’App Store ; Roam en déclare un — la localisation — et le dépôt contient un garde-fou qui fait échouer la compilation si cette liste gagne ne serait-ce qu’une entrée.
Questions fréquentes
Pourquoi mon iPhone a-t-il cessé d’enregistrer ma sortie en arrière-plan ?
Presque toujours parce qu’iOS a suspendu ou terminé l’app sous la pression mémoire, ou parce qu’elle a été fermée de force depuis le sélecteur d’apps. Le mode d’arrière-plan de localisation maintient un enregistreur en vie bien plus longtemps qu’une app ordinaire, mais ce n’est pas une garantie absolue : ce que l’app fait de chaque point compte donc plus que le fait de rester en vie.
Faut-il l’autorisation Toujours pour enregistrer une sortie ?
Non. « Lorsque l’app est active » suffit pour enregistrer écran éteint, parce que le mode d’arrière-plan de localisation garde l’app en exécution tant que les mises à jour arrivent. Toujours ajoute la possibilité, pour iOS, de relancer l’app en arrière-plan si elle a été terminée : c’est une assurance pour les longues sorties, pas une obligation.
Le GPS en arrière-plan vide-t-il la batterie ?
Il consomme réellement : le récepteur tourne en continu et l’app se réveille à chaque point. Un téléphone moderne encaisse sans problème une sortie de plusieurs heures ; c’est sur une journée entière que la question se pose, et c’est là qu’une app qui écrit au fil de l’eau fait la différence entre perdre les dernières minutes et perdre la journée.
Comment tester si mon enregistreur perd des données ?
Lancez un enregistrement, marchez cinq minutes, forcez la fermeture de l’app depuis le sélecteur d’apps, puis rouvrez-la. Si ces cinq minutes ont survécu, l’app écrit au fil de l’eau. Sinon, c’est qu’elle gardait votre sortie en mémoire.
Un enregistreur qui ne perd pas la sortie
Roam valide chaque point GPS sur le téléphone à l’instant où il arrive, marque les coupures de signal au lieu d’y tracer une ligne droite, et lit le dénivelé au baromètre plutôt que dans l’altitude GPS. Ni compte, ni connexion, ni synchronisation. Enregistrer une sortie, la consulter et la rejouer sont gratuits.