From a4f8276b136ab8c0cc021dc7c3441ad809afb70d Mon Sep 17 00:00:00 2001 From: Sylvain Date: Mon, 25 May 2026 19:47:17 +0200 Subject: [PATCH] =?UTF-8?q?fix(watchos):=20emp=C3=AAche=20les=20sessions?= =?UTF-8?q?=20HK=20multiples=20+=20nettoie=20apr=C3=A8s=20=C3=A9chec/fin?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Garde anti double-démarrage (guard !isRunning, session == nil) pour éviter la cascade de HKLiveWorkoutBuilder en Error(7) quand on retape l'activité. Reset session/builder à nil après échec, fin et erreur de séance pour permettre une nouvelle tentative propre. Le statusMessage d'erreur reste donc visible sur le picker. Co-Authored-By: Claude Opus 4.7 (1M context) --- ios/App/CoachWatch/WorkoutManager.swift | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-) diff --git a/ios/App/CoachWatch/WorkoutManager.swift b/ios/App/CoachWatch/WorkoutManager.swift index 13c5a03..029f1bf 100644 --- a/ios/App/CoachWatch/WorkoutManager.swift +++ b/ios/App/CoachWatch/WorkoutManager.swift @@ -26,6 +26,7 @@ final class WorkoutManager: NSObject, ObservableObject { func startWorkout(activityType: HKWorkoutActivityType, locationType: HKWorkoutSessionLocationType) async { + guard !isRunning, session == nil else { return } guard HKHealthStore.isHealthDataAvailable() else { statusMessage = "HealthKit indisponible sur cet appareil" return @@ -63,6 +64,8 @@ final class WorkoutManager: NSObject, ObservableObject { isRunning = true statusMessage = nil } catch { + self.session = nil + self.builder = nil statusMessage = "Démarrage séance impossible : \(error.localizedDescription)" } } @@ -141,7 +144,11 @@ extension WorkoutManager: HKWorkoutSessionDelegate { try? await builder.endCollection(at: date) _ = try? await builder.finishWorkout() } - Task { @MainActor in self.isRunning = false } + Task { @MainActor in + self.isRunning = false + self.session = nil + self.builder = nil + } } nonisolated func workoutSession(_ workoutSession: HKWorkoutSession, @@ -150,6 +157,8 @@ extension WorkoutManager: HKWorkoutSessionDelegate { Task { @MainActor in self.statusMessage = "Erreur séance : \(message)" self.isRunning = false + self.session = nil + self.builder = nil } } }