您如何使用 HealthKit 检测锻炼开始/停止?

Posted

技术标签:

【中文标题】您如何使用 HealthKit 检测锻炼开始/停止?【英文标题】:How do you detect Workout start / stop with HealthKit? 【发布时间】:2016-06-25 00:44:26 【问题描述】:

我正在寻找一种方法来检测锻炼检测/停止使用 HealthKit,但似乎无法检测到它。

android 中,您会获得会话的“ACTION_SESSION_START”和“ACTION_SESSION_END”。

有没有人尝试检测锻炼开始/停止?

感谢您的宝贵时间!

【问题讨论】:

您是否尝试检测 watchOS 上的另一个应用程序何时?没有用于此的 API。你想用这些信息做什么? @Allan 我正在为 HealthKit 创建一个测试应用程序,想知道是否有任何方法可以“监听”或“查询”锻炼状态的状态变化,无论是来自另一个应用程序还是来自苹果手表。基本上是用测试应用程序记录“任何锻炼开始”或“任何锻炼停止”。谢谢你的回答! 我没有在HKWorkout 文档中看到此功能:developer.apple.com/reference/healthkit/hkworkout This 是一个很棒的教程,应该可以回答你的问题。 @Dershowitz123 该教程展示了如何保存锻炼,而不是检测它们。 【参考方案1】:

没有用于观察其他应用记录的锻炼的 API。

【讨论】:

【参考方案2】:

我以为你可以检测事件。不保存锻炼。

在 HealthKit 中,您可以创建锻炼事件。因此,理论上您可以编写一些代码来检测pause/resume 事件。

创建一个持续 ___ 时间的跑步锻炼。

let finish = NSDate() // Now  
let start = finish.dateByAddingTimeInterval(0000) // workout time

let workout = HKWorkout(activityType: .Running, startDate: start, endDate: finish) 

创建Pause(停止)和Resume(开始)事件。

let workoutEvents: [HKWorkoutEvent] = [  
HKWorkoutEvent(type: .Pause, date: startDate.dateByAddingTimeInterval(000)),
HKWorkoutEvent(type: .Resume, date: startDate.dateByAddingTimeInterval(000))
]

然后您需要更改HKWorkout 对象的创建以使用更复杂的构造函数,它允许您包含workoutEvents

let workout = HKWorkout(  
activityType: .Running
startDate: start,
endDate: end,
workoutEvents: workoutEvents,
device: nil,
metadata: nil
)

此时,您通常会将锻炼传递给HKHealthStore.saveObject 以保存它。

healthStore.saveObject(workout)  (success: Bool, error: NSError?) -> Void in

if success 
    // Workout was saved

else 
    // Workout was not saved


但是

在您的情况下,您不想保存。您想要检测事件。可能有一个 switch 语句可以检测到 PauseResume

我不确定您想要的特定 dateByAddingTimeInterval 值,但您绝对可以尝试使用零值吗?因为从技术上讲,00 仍然是一个事件。

锻炼事件在活动和非活动状态之间切换锻炼对象。你可以创建一个方法detectWorkoutEvent

【讨论】:

以上是关于您如何使用 HealthKit 检测锻炼开始/停止?的主要内容,如果未能解决你的问题,请参考以下文章

错误:停止的锻炼会话无法重新开始

如何在 HealthKit 中获得使用 Cordova 编写锻炼路线的许可

如何在 HealthKit 中获得使用 Cordova 编写锻炼路线的许可

如何使用 Swift 在 healthkit 中访问锻炼的元数据

如何在 WatchOS 上通过 HealthKit 访问锻炼?

如何从 HealthKit 跑步锻炼中获取海拔增益、节奏和跑步速度?