Diagnostic via getStatus build 18 : fireCount=10 mais lastNotifAt=""
et lastWorkoutUUID="" → l'observer fire mais fetchLatestWorkout ne
trouve aucun workout. Le predicate
HKQuery.predicateForSamples(withStart: now-1h, end: nil) filtre par
startDate, ce qui rate les workouts dont startDate est antérieur à
now-1h (ex: workout long en cours, ou workouts sync depuis iCloud
historique).
Refactor : HKAnchoredObjectQuery (API Apple-recommandée pour ce cas).
- Au boot, charge l'anchor stocké via NSKeyedArchiver/Unarchiver
- Au 1er fire (anchor nil), enregistre le nouvel anchor SANS notifier
(skip back-historize : évite spam si HealthKit sync un gros
historique iCloud)
- Aux fires suivants, retourne uniquement les samples ajoutés depuis
l'anchor précédent → notif sur le plus récent par endDate
- Persistance anchor via UserDefaults (NSKeyedArchiver requiringSecureCoding)
Nouvelle méthode resetAnchor() exposée au JS pour permettre le reset
côté debug — utile pour tester avec un workout pré-existant.
Signatures vérifiées via JSON DocC Apple :
- HKAnchoredObjectQuery(type:predicate:anchor:limit:resultsHandler:) ✓
- HKObjectQueryNoLimit (var global Int) ✓