Piloter la séance depuis la Live Activity (Pause / Terminer)

Comme l'app Exercice : deux boutons sur la bannière de l'écran verrouillé et
dans l'île dépliée. iOS n'expose aucun geste de balayage pour révéler des
actions — depuis iOS 17, ce sont des boutons intégrés (App Intents), et c'est
le seul mécanisme public.

- Intents `CoachTogglePauseIntent` / `CoachEndWorkoutIntent`, conformes à
  LiveActivityIntent (sans quoi `perform()` n'est jamais appelé).
- Ils vivent dans CoachLiveActivityAttributes.swift, seul fichier déjà membre
  des deux targets : un fichier neuf imposerait une manip Target Membership
  dans Xcode, source d'erreurs répétées ici.
- Commandes relayées à la montre par WCSession, avec repli transferUserInfo :
  isReachable retombe à false quand la séance tourne en arrière-plan profond,
  la commande est alors différée au réveil de l'app montre.
- L'état de pause remonte depuis HKWorkoutSession (seule source fiable : la
  montre peut mettre en pause d'elle-même) et bascule le libellé du bouton.
- Le watchdog de LiveStore est neutralisé pendant la pause : sans ça, l'absence
  de samples aurait affiché « connexion perdue » puis terminé l'activité.
- L'app watchOS gagne le bouton Pause qui lui manquait, aligné sur le même état.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
This commit is contained in:
Sylvain Bettinelli
2026-08-11 13:25:14 +00:00
parent ce048ee634
commit 21d39f2e98
8 changed files with 283 additions and 15 deletions

View File

@@ -91,6 +91,36 @@ Il vient de l'ancien build. Il partira soit au premier `liveEnded` reçu (la
nouvelle app reprend la main dessus via `adoptExisting()`), soit après 6 h,
soit tout de suite si tu le fermes à la main (appui long → fermer).
## Étape 4bis — Les boutons Pause / Terminer *(build du 2026-08-11, second lot)*
La Live Activity porte maintenant deux boutons, comme l'app Exercice :
**Pause / Reprendre** et **Terminer**. Ils apparaissent sur la bannière de
l'écran verrouillé et dans l'île dynamique **dépliée** (appui long sur l'île) —
pas en mode compact, où iOS n'accepte aucun bouton.
Aucune manipulation Xcode : les intents vivent dans
`CoachLiveActivityAttributes.swift`, déjà membre des deux targets.
À tester, séance en cours :
1. **Appui long sur l'île** → les deux boutons apparaissent
2. **Pause** → la séance se met en pause sur la montre, le bouton devient
**Reprendre**, et la page `/live` ne bascule **pas** en « Connexion perdue »
(le watchdog est neutralisé pendant la pause)
3. **Reprendre** → la FC repart
4. **Terminer** → la séance s'arrête sur la montre et la Live Activity
disparaît immédiatement
⚠️ **Limite Apple, à connaître avant de crier au bug** : `WCSession.isReachable`
retombe à false quand l'app watchOS tourne sa séance en arrière-plan profond
(poignet baissé, écran éteint). La commande bascule alors sur
`transferUserInfo` : elle est **garantie mais différée**, donc elle s'applique
au réveil de l'app montre et non à la seconde. Poignet levé, c'est immédiat.
Aucune API publique ne fait mieux.
Détail mineur : en **mode test** (FC simulée), la pause bascule l'état mais la
simulation continue d'émettre des samples. Sans effet sur une vraie séance.
## Étape 5 — TestFlight *(facultatif)*
Rien de spécifique ici : c'est la procédure habituelle, étapes 7 à 9 de