fix(watchos): empêche les sessions HK multiples + nettoie après échec/fin

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) <noreply@anthropic.com>
This commit is contained in:
Sylvain
2026-05-25 19:47:17 +02:00
parent ef69240af2
commit a4f8276b13

View File

@@ -26,6 +26,7 @@ final class WorkoutManager: NSObject, ObservableObject {
func startWorkout(activityType: HKWorkoutActivityType, func startWorkout(activityType: HKWorkoutActivityType,
locationType: HKWorkoutSessionLocationType) async { locationType: HKWorkoutSessionLocationType) async {
guard !isRunning, session == nil else { return }
guard HKHealthStore.isHealthDataAvailable() else { guard HKHealthStore.isHealthDataAvailable() else {
statusMessage = "HealthKit indisponible sur cet appareil" statusMessage = "HealthKit indisponible sur cet appareil"
return return
@@ -63,6 +64,8 @@ final class WorkoutManager: NSObject, ObservableObject {
isRunning = true isRunning = true
statusMessage = nil statusMessage = nil
} catch { } catch {
self.session = nil
self.builder = nil
statusMessage = "Démarrage séance impossible : \(error.localizedDescription)" statusMessage = "Démarrage séance impossible : \(error.localizedDescription)"
} }
} }
@@ -141,7 +144,11 @@ extension WorkoutManager: HKWorkoutSessionDelegate {
try? await builder.endCollection(at: date) try? await builder.endCollection(at: date)
_ = try? await builder.finishWorkout() _ = 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, nonisolated func workoutSession(_ workoutSession: HKWorkoutSession,
@@ -150,6 +157,8 @@ extension WorkoutManager: HKWorkoutSessionDelegate {
Task { @MainActor in Task { @MainActor in
self.statusMessage = "Erreur séance : \(message)" self.statusMessage = "Erreur séance : \(message)"
self.isRunning = false self.isRunning = false
self.session = nil
self.builder = nil
} }
} }
} }