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é). // iOS la 1re fois, return immédiat si déjà accordé).
do { do {
try await WorkoutScheduler.shared.requestAuthorization() try await WorkoutScheduler.shared.requestAuthorization()
NSLog("[CoachWorkoutKit] requestAuthorization OK")
} catch { } catch {
NSLog("[CoachWorkoutKit] requestAuthorization failed: \(error)") NSLog("[CoachWorkoutKit] requestAuthorization failed: \(error)")
} }
// 9. preview(plan) (iOS 17.4+) ouvre la sheet système 'Ajouter à // 9. Schedule le workout. Schedule pour 1 minute dans le futur (vs
// mes workouts' qui ajoute le workout à la **Custom Workouts** // "now") pour s'assurer que la date n'est pas dans le passé au
// library de l'Apple Watch (vs schedule() qui le met juste dans // moment où le système traite l'event (sinon il peut être ignoré).
// le calendrier Fitness sans le rendre lançable de manière standalone). let scheduleDate = Date().addingTimeInterval(60) // +1 min
if #available(iOS 17.4, *) { let comps = Calendar.current.dateComponents(
try await WorkoutScheduler.shared.preview(plan) [.year, .month, .day, .hour, .minute, .timeZone],
} else { from: scheduleDate
// 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()
) )
_ = 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)")
} }
} }