feat(watch): complications Apple Watch (Forme + Séance du jour)
L'App Group n'étant pas partagé entre appareils, le snapshot transite par WatchConnectivity : iPhone CoachWidgetBridge.pushToWatch (updateApplicationContext) -> CoachWatch/ConnectivityManager reçoit -> App Group de la montre + reload des complications. Nouvelles complications (CoachWatchWidgets/CoachWatchComplications.swift) : Forme (accessoryCircular/corner, Gauge) + Séance du jour (accessoryRectangular/inline). ⚠️ Reste Mac : créer la target widget watchOS + App Group/capability + Target Membership. Runbook complet dans docs/widgets-runbook-mac.md. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
This commit is contained in:
@@ -68,7 +68,36 @@ droite → *Target Membership*.
|
||||
```
|
||||
`sport` ∈ running | cycling | strength | mobility | hiking | walking | rest.
|
||||
|
||||
## Complication Apple Watch (code écrit — reste la target Xcode)
|
||||
|
||||
⚠️ **Rappel archi** : l'App Group n'est PAS partagé entre iPhone et Watch (conteneurs
|
||||
distincts). Le flux est : iPhone `CoachWidgetBridge.pushToWatch` → `updateApplicationContext`
|
||||
→ `CoachWatch/ConnectivityManager` reçoit → écrit dans l'App Group de la MONTRE →
|
||||
la complication lit ce conteneur. Tout ce code est déjà écrit & committé.
|
||||
|
||||
### Déjà fait (committé)
|
||||
- iPhone : `CoachWidgetBridge.pushToWatch()` envoie le snapshot via WCSession (sans être delegate).
|
||||
- Watch : `CoachWatch/ConnectivityManager` gère `didReceiveApplicationContext`/`didReceiveUserInfo`
|
||||
→ `CoachWidgetStore.save` + `WidgetCenter.reloadAllTimelines()`.
|
||||
- `ios/App/CoachWatchWidgets/CoachWatchComplications.swift` — 2 complications
|
||||
(Forme : circular/corner ; Séance : rectangular/inline) + `@main` WidgetBundle.
|
||||
|
||||
### Étapes Mac
|
||||
1. **Créer la target** : File → New → Target → **Widget Extension** (plateforme **watchOS**),
|
||||
nom `CoachWatchWidgets`, embarquée dans l'app Watch `CoachWatch`. Supprimer le fichier
|
||||
template généré, puis **Add Files** `CoachWatchComplications.swift` à cette target.
|
||||
2. **Target Membership de `CoachWidgetSnapshot.swift`** : cocher **CoachWatch** (l'app Watch,
|
||||
pour `ConnectivityManager`) **ET CoachWatchWidgets** (l'extension complication).
|
||||
3. **App Group** `group.ch.hypnotruck.coach` : activer la capability sur **CoachWatch** ET
|
||||
**CoachWatchWidgets** (même ID que l'iPhone ; conteneur physique distinct côté montre).
|
||||
4. **Build** la target Watch + extension, lancer sur la montre. Ajouter les complications
|
||||
sur un cadran (Forme = circular ; Séance = rectangular). Ouvrir l'app iPhone une fois
|
||||
pour pousser le 1er snapshot (l'app Watch doit être installée & appairée).
|
||||
5. Si la complication reste vide : vérifier que `updateApplicationContext` arrive
|
||||
(log `widgetSnapshot reçu de l'iPhone` côté watch) et que l'App Group est bien partagé
|
||||
sur les deux targets watch.
|
||||
|
||||
## Suite possible (backlog)
|
||||
- Complication **Watch** (nouvelle target widget watchOS — à créer dans Xcode).
|
||||
- Lockscreen widgets (`accessoryRectangular` / `accessoryCircular`) — ajouter les familles.
|
||||
- Background refresh (App Background Tasks) si on veut un widget à jour sans ouvrir l'app.
|
||||
- Lockscreen widgets iPhone (`accessoryRectangular` / `accessoryCircular`) — ajouter les familles aux widgets iOS.
|
||||
- `transferCurrentComplicationUserInfo` (réveil complication, budget ~50/j) si besoin de fraîcheur en arrière-plan.
|
||||
- Background refresh iPhone (App Background Tasks) pour un widget à jour sans ouvrir l'app.
|
||||
|
||||
Reference in New Issue
Block a user