HKWorkoutSessionDelegate:workoutSession(_:didGenerate:) 暂停检测问题

Rap*_*euf 1 appdelegate swift healthkit watchkit pause

我正在为 Apple Watch 构建跑步锻炼项目,但在实现“自动暂停”功能时遇到问题。委托HKWorkoutSessionDelegate : workoutSession(_:didGenerate:)应该获取系统生成的一些暂停事件。

我遇到的问题是我的会话永远不会启动:暂停事件立即发送给委托。

我的代码:

func workoutSession(_ workoutSession: HKWorkoutSession, didGenerate event: HKWorkoutEvent) {
            // press 2 buttons
            if(event.type == HKWorkoutEventType.pauseOrResumeRequest) {
                print("Detected Press")
                if workoutData.isPaused == false {
                    pauseWorkout()
                }
                else {
                    resumeWorkout()
                }
            }

            // Auto-pause
            if event.type == HKWorkoutEventType.motionPaused && workoutSettings.autoPause {
                print("Auto Pause")
                pauseWorkout()
            }
            if event.type == HKWorkoutEventType.motionResumed && workoutSettings.autoPause {
                print("Auto Resume")
                resumeWorkout()
            }
        }
Run Code Online (Sandbox Code Playgroud)

问题出现在“//自动暂停”部分。我错过了什么吗?

Rap*_*euf 6

我终于找到了处理这种情况的办法。当我收到 .motionPaused 或 .motionResumed 事件时,我必须手动将 .pause 和 .resume 事件添加到锻炼构建器,以使总锻炼时间准确。Apple 文档中没有对此进行解释,因此我希望它能帮助其他面临同样问题的人。通过这样做,自动暂停/恢复工作正常:

case .motionPaused:
            toggleSessionDisplayState(.paused)
            // manually add pause event to fix workout duration
            workoutBuilder.addWorkoutEvents([HKWorkoutEvent(type: .pause, dateInterval: DateInterval(start: Date(),duration: 0), metadata: [:])])  { (success, error) in
                if error != nil {
                    print(error!)
                }
            }
            os_log("Auto Pause Builder Event")
            
case .motionResumed:
            toggleSessionDisplayState(.running)
            // manually add resume event to fix workout duration
            workoutBuilder.addWorkoutEvents([HKWorkoutEvent(type: .resume, dateInterval: DateInterval(start: Date(),duration: 0), metadata: [:])])  { (success, error) in
                if error != nil {
                    print(error!)
                }
            }
            os_log("Auto Resume Builder Event")
Run Code Online (Sandbox Code Playgroud)