Envoi et synchronisation
Comment les enregistrements voyagent d'Apple Santé vers vos serveurs, ce que signifient les états, et ce que Courier promet (et, honnêtement, ne promet pas) en matière de délais.
Déclencheurs
- Livraison en arrière-plan — Apple Santé reçoit de nouvelles données de sommeil ou d'entraînement et iOS réveille brièvement Courier ; il lit le delta et envoie.
- Ouverture de l'app — synchronisation au premier plan au lancement et au retour.
- Manuel — les actions d'envoi dans l'app, ou le Raccourci Envoyer maintenant.
- Envoi groupé — La rédaction → Envoi groupé : choisissez une plage de dates et rattrapez l'historique vers n'importe quel abonné.
Les quatre alimentent la même chaîne.
États des éléments
Chaque enregistrement sortant traverse une machine à états explicite, persistée pour qu'une fermeture forcée ou un redémarrage ne fasse rien perdre :
| État | Signification |
|---|---|
queued | Attend son tour |
awaitingRoute | Entraînement en extérieur dont la trace GPS n'est pas encore arrivée depuis la Watch — Courier attend plutôt que d'envoyer un enregistrement incomplet |
sending | Requête en cours |
sent | Livré (2xx). Consigné dans le registre |
failed | Échoué et acquitté — ne sera jamais réessayé automatiquement ; utilisez le renvoi manuel |
needsAttention | Échoué/incomplet et pas encore acquitté : réessais épuisés, parcours jamais arrivé, ou données source disparues. Point rouge + notification |
Réessais
- Les envois au premier plan réessaient les erreurs réseau avec un recul exponentiel (2 s → 4 s → 8 s → 16 s).
- Les envois en arrière-plan ont droit à une seule tentative avec un délai d'expiration de 15 secondes — le temps d'arrière-plan d'iOS est rare et Courier ne joue pas avec. Les échecs rejoignent simplement la file à traiter.
- Rien n'est jamais réessayé automatiquement une fois l'état
failedatteint — vous gardez la main sur ce qui est renvoyé.
Idempotence
Chaque requête porte un en-tête Idempotency-Key :
- Les envois normaux et les réessais manuels utilisent l'
idcanonical stable de l'enregistrement — un point de terminaison qui déduplique par clé ne stockera jamais deux fois le même entraînement, quel que soit le nombre de tentatives de livraison. - Les doublons délibérés (« envoyer une autre copie ») font tourner la clé en
id#2,id#3, … pour que les points de terminaison idempotents puissent quand même accepter des copies intentionnelles.
Si votre serveur respecte Idempotency-Key (ou fait un upsert par data.id), toute la chaîne devient sûre à réessayer à n'importe quel moment.
Le registre
La rédaction → Historique d'envoi affiche chaque envoi avec horodatage, abonné, statut HTTP et extrait de la réponse. Le registre conserve 6 mois d'historique ; les entrées plus anciennes sont nettoyées automatiquement — le contenu livré, lui, vit bien sûr sur vos points de terminaison.
Les délais, honnêtement
La livraison en arrière-plan est régulée par iOS. Attendez-vous à un délai de quelques minutes à une heure environ et, au pire, l'envoi se fait à la prochaine ouverture de l'app. Courier l'affiche tel quel dans son interface plutôt que de prétendre être instantané. S'il vous faut un envoi garanti tout de suite : ouvrez l'app, ou utilisez le Raccourci Envoyer maintenant.
Notifications
Deux modes (La rédaction → Notifications) :
- Toujours — une notification récapitulative après chaque salve d'envois automatiques, succès ou échec. Par défaut.
- Échecs uniquement — le silence, sauf si quelque chose a besoin de vous.
Les notifications nécessitent la permission système ; si elle a été refusée, Courier affiche l'état réel et un raccourci vers les Réglages iOS au lieu de faire semblant de fonctionner.