为什么我的 HKWorkoutSession(通常)没有结束?

yan*_*nom 4 swift healthkit apple-watch watchkit

我正在为 Apple Watch 开发一个非常简单的锻炼应用程序。它使用 Health Kit 来开始和结束锻炼,我唯一的问题是,当我尝试结束锻炼时,它通常不会结束会话,并且出现此错误

2020-07-22 12:27:46.547720-0700 5k WatchKit Extension[25774:944527] [workouts] <HKWorkoutSession:0x80156310 A54AF52C-8B08-4BAD-A28C-03D8E54044B5 ended>: Failed to end: Error Domain=com.apple.healthkit Code=3 "Unable to transition to the desired state from the Ended(3) state (event 6). Allowed transitions from the current state are: {
    7 = "<error(7): Ended(3) -> Ended(3)>";
}" UserInfo={NSLocalizedDescription=Unable to transition to the desired state from the Ended(3) state (event 6). Allowed transitions from the current state are: {
    7 = "<error(7): Ended(3) -> Ended(3)>";
}}
Run Code Online (Sandbox Code Playgroud)

我真的不知道从哪里开始从这些信息中寻找问题,也不知道这意味着什么。此外,通常在第四次或第五次尝试时,它实际上会结束锻炼课程。

Nas*_*ova 6

可能的原因是结束锻炼课程和锻炼构建器数据收集的顺序错误。

如果您的代码看起来与此类似,您将收到错误:

session.end()
        
builder.endCollection(withEnd: Date()) { (success, error) in
 builder.finishWorkout { (workout, error) in
// do something
 }
}
Run Code Online (Sandbox Code Playgroud)

会话尚未完成,但代码立即尝试结束构建器的会话。

在Apple的示例中(https://developer.apple.com/documentation/healthkit/workouts_and_activity_rings/speedysloth_creating_a_workout)是通过代表完成锻炼的正确方法:

session.delegate = self
.....
func endWorkout() {
        // End the workout session.
        session.end()
}
....
extension WorkoutManager: HKWorkoutSessionDelegate {
    func workoutSession(_ workoutSession: HKWorkoutSession, didChangeTo toState: HKWorkoutSessionState,
                        from fromState: HKWorkoutSessionState, date: Date) {
        // Wait for the session to transition states before ending the builder.
        /// - Tag: SaveWorkout
        if toState == .ended {
            print("The workout has now ended.")
            builder.endCollection(withEnd: Date()) { (success, error) in
                self.builder.finishWorkout { (workout, error) in
                    // Optionally display a workout summary to the user.
                    self.resetWorkout()
                }
            }
        }
    }
    
    func workoutSession(_ workoutSession: HKWorkoutSession, didFailWithError error: Error) {
        
    }
}
Run Code Online (Sandbox Code Playgroud)