WorkoutKit : retire preview() (API absente du SDK), schedule() à +1min + logs

preview() ne compile pas dans le SDK actuel (iOS 17.4+ pas dispo).
On revient sur schedule() qui marche, avec 2 améliorations :
- Schedule à Date()+60s au lieu de Date() pour éviter qu'iOS ignore
  un workout dont la date passe au moment du traitement (race condition).
- NSLog du résultat (id + date) pour diagnostic Console.app si l'user
  ne voit toujours rien sur la Watch malgré schedule succès.

Limitation : avec schedule(), le workout apparaît dans la liste 'Programmées'
au TOP de l'app Workout sur l'Apple Watch (avec icône ), PAS dans la
sous-section 'Custom Workouts'. C'est l'API qu'Apple expose actuellement
pour pousser des CustomWorkout via WorkoutKit — la sous-section Custom
Workouts ne semble pas writable depuis 3rd-party apps directement.
This commit is contained in:
Sylvain Bettinelli
2026-05-08 10:16:00 +00:00
parent f3c976e0d7
commit cb9d32d928

View File

@@ -153,25 +153,20 @@ public class CoachWorkoutKitPlugin: CAPPlugin, CAPBridgedPlugin {
// iOS la 1re fois, return immédiat si déjà accordé).
do {
try await WorkoutScheduler.shared.requestAuthorization()
NSLog("[CoachWorkoutKit] requestAuthorization OK")
} catch {
NSLog("[CoachWorkoutKit] requestAuthorization failed: \(error)")
}
// 9. preview(plan) (iOS 17.4+) ouvre la sheet système 'Ajouter à
// mes workouts' qui ajoute le workout à la **Custom Workouts**
// library de l'Apple Watch (vs schedule() qui le met juste dans
// le calendrier Fitness sans le rendre lançable de manière standalone).
if #available(iOS 17.4, *) {
try await WorkoutScheduler.shared.preview(plan)
} else {
// Fallback iOS 17.0-17.3 : schedule pour "maintenant".
// L'user verra le workout dans le Workout app au lancement (top
// de la liste des activités) mais pas dans Custom Workouts.
let now = Calendar.current.dateComponents(
[.year, .month, .day, .hour, .minute],
from: Date()
// 9. Schedule le workout. Schedule pour 1 minute dans le futur (vs
// "now") pour s'assurer que la date n'est pas dans le passé au
// moment où le système traite l'event (sinon il peut être ignoré).
let scheduleDate = Date().addingTimeInterval(60) // +1 min
let comps = Calendar.current.dateComponents(
[.year, .month, .day, .hour, .minute, .timeZone],
from: scheduleDate
)
_ = try await WorkoutScheduler.shared.schedule(plan, at: now)
}
let scheduled = try await WorkoutScheduler.shared.schedule(plan, at: comps)
NSLog("[CoachWorkoutKit] schedule OK : \(scheduled.id) at \(scheduled.date)")
}
}