我正在尝试跟踪用户在 session 期间采取的步骤。这些 session 可以是 30 秒到 30 分钟不等。我开始类(class)并开始四处走动,然后一分钟后我停止了类(class)。这总是返回 0 步。这是我正在运行的代码。
func readUserSteps(startDate:NSDate, endDate:NSDate) {
let weightSampleType = HKSampleType.quantityTypeForIdentifier(HKQuantityTypeIdentifierStepCount)
let predicate = HKQuery.predicateForSamplesWithStartDate(startDate, endDate: endDate, options: .None)
let query = HKSampleQuery(sampleType: weightSampleType!, predicate: predicate, limit: 0, sortDescriptors: nil, resultsHandler: {
(query, results, error) in
if results == nil {
print("There was an error running the query: \(error)")
} else {
var stepCount:Double = 0
for steps in results as! [HKQuantitySample]
{
stepCount += steps.quantity.doubleValueForUnit(HKUnit.countUnit())
}
print("Steps Taken: \(stepCount)")
}
})
self.healthKitStore.executeQuery(query)
}
我将当前日期保存为:let startTime = NSDate()
来表示 session 的开始,一旦用户停止 session ,我将 session 的结束保存为如下:让 endTime = NSDate()
。然后我用创建的这两个变量调用上面的函数。不幸的是,“stepCount”总是返回 0..我在这里做错了什么?
最佳答案
如果您只想计算 iPhone 或 Apple Watch 记录的用户步数,我建议使用 CMPedometer API,因为它始终拥有最新的记录。不过,如果您仍然想使用 HealthKit,则需要向 HealthKit 表明您的应用有兴趣通过执行任何具有 updateHandler
属性 ( HKObserverQuery ) 的查询类型来“观察”步骤, HKStatisticsCollectionQuery , 或 HKAnchoredObjectQuery ).在 session 开始时使用更新处理程序执行其中一个查询,以使 HealthKit 更频繁地导入步数。
HKObserverQuery
只会在 HealthKit 中出现新的步数时通知您,因此在 session 结束时您需要重新查询总数。另一方面,HKStatisticsCollectionQuery
和 HKAnchoredObjectQuery
可以在 session 运行时将结果流式传输到您的应用,这可能会提高性能。
最后,请注意简单地对 HKQuantitySamples
的值求和以计算总步数。来自多个来源的 HealthKit 数据可以在时间上重叠。例如,Apple Watch 用户可以在 HealthKit 中获得一天中佩戴 watch 和携带手机期间的多个步数来源。因此,最好使用 HKStatisticsQuery
或 HKStatisticsCollectionQuery
来计算总和,因为这样可以避免重复计算重叠样本。
关于iOS HealthKit 在 session 期间跟踪用户步数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37547197/