Skip to content

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 ​

  1. 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.
  2. Ouverture de l'app — synchronisation au premier plan au lancement et au retour.
  3. Manuel — les actions d'envoi dans l'app, ou le Raccourci Envoyer maintenant.
  4. 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 :

ÉtatSignification
queuedAttend son tour
awaitingRouteEntraî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
sendingRequête en cours
sentLivré (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 failed atteint — 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'id canonical 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.