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:
@@ -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
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user