Le widget ne passait pas minuit : personne ne lisait updatedAt
Signale par Sylvain le 2026-08-18 : passe minuit, l'hydratation, les calories et la seance de la veille restaient affichees comme celles du jour. Il fallait ouvrir l'app pour les voir retomber a zero. Le widget n'a AUCUN acces reseau : il rend ce que l'app lui a pousse la derniere fois qu'elle a tourne. Le snapshot portait deja `updatedAt` — rien ne le lisait. CoachQuickWidget programmait meme un reveil a minuit, avec le bon commentaire, mais relisait ensuite les memes chiffres sans regarder leur date : le rechargement avait lieu, la remise a zero non. - `CoachWidgetSnapshot.asOf(_:)` : vide ce qui decrit UNE journee (eau, cafes, kcal, routine, activite faite, score de forme) quand le snapshot date d'un autre jour. Conserve ce qui traverse les jours — objectifs et zones cardiaques. Les compteurs repartent a 0 et non a nil : au matin, « rien bu » est vrai, « je ne sais pas » ne l'est pas. - Les trois providers emettent une 2e entree datee de minuit. WidgetKit bascule seul, sans reveiller l'app. - `tomorrow` : la seance du lendemain, poussee par le pont web. Sans elle, vider la seance ferait annoncer JOUR OFF chaque nuit — l'agacement d'un incident precedent, repete tous les jours. ⚠️ Deuxieme occurrence trouvee en verifiant, et pire : CoachQuickSync.credit() ajoutait au total EXISTANT puis rehorodatait a maintenant. Sur un snapshot de la veille, 200 ml bus le matin donnaient « 2 200 ml » estampilles du jour — un total faux, que la peremption ne pouvait plus rattraper. ⚠️ NON COMPILE : pas de toolchain Swift ici. Build Xcode requis sur le Mac mini pour que le correctif arrive sur l'iPhone et la Watch.
This commit is contained in:
@@ -51,13 +51,24 @@ struct WatchProvider: TimelineProvider {
|
||||
WatchEntry(date: Date(), snapshot: nil)
|
||||
}
|
||||
func getSnapshot(in context: Context, completion: @escaping (WatchEntry) -> Void) {
|
||||
completion(WatchEntry(date: Date(), snapshot: CoachWidgetStore.load()))
|
||||
let now = Date()
|
||||
completion(WatchEntry(date: now, snapshot: CoachWidgetStore.load()?.asOf(now)))
|
||||
}
|
||||
/// Même correctif que les widgets iPhone : une entrée maintenant, une à
|
||||
/// minuit avec le snapshot périmé remis à zéro. Sans elle, la complication
|
||||
/// affichait les chiffres de la veille jusqu'à réouverture de l'app —
|
||||
/// et sur une montre, c'est encore plus visible : elle est au poignet
|
||||
/// avant que l'iPhone ne soit déverrouillé.
|
||||
func getTimeline(in context: Context, completion: @escaping (Timeline<WatchEntry>) -> Void) {
|
||||
let entry = WatchEntry(date: Date(), snapshot: CoachWidgetStore.load())
|
||||
let next = Calendar.current.date(byAdding: .hour, value: 2, to: Date())
|
||||
?? Date().addingTimeInterval(7200)
|
||||
completion(Timeline(entries: [entry], policy: .after(next)))
|
||||
let now = Date()
|
||||
let stored = CoachWidgetStore.load()
|
||||
let midnight = CoachWidgetSnapshot.nextMidnight(after: now)
|
||||
let entries = [
|
||||
WatchEntry(date: now, snapshot: stored?.asOf(now)),
|
||||
WatchEntry(date: midnight, snapshot: stored?.asOf(midnight)),
|
||||
]
|
||||
completion(Timeline(entries: entries,
|
||||
policy: .after(midnight.addingTimeInterval(60))))
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user