iOS HealthKit会话期间跟踪用户步骤

时间:2016-05-31 13:30:23

标签: ios objective-c swift session health-kit

我正在尝试跟踪会话期间所采取的用户步骤。这些会话可以是30秒到30分钟。我开始会议并开始走动,然后一分钟后我停止会话。这总是返回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()表示会话的开始,一旦用户停止会话,我将保存会话结束:let endTime = NSDate()。然后我用这两个变量创建了上面的函数。不幸的是,' stepCount'总是回来0 ..我在这里做错了什么?

1 个答案:

答案 0 :(得分:1)

如果您只想计算iPhone或Apple Watch记录的用户步骤,我建议使用CMPedometer API,因为它始终拥有最新的记录。但是,如果您仍然喜欢使用HealthKit,则需要向HealthKit表明您的应用感兴趣并且观察"通过执行具有updateHandler属性(HKObserverQueryHKStatisticsCollectionQueryHKAnchoredObjectQuery)的任何查询类型的步骤。在会话开始时使用更新处理程序执行其中一个查询,以使HealthKit更频繁地导入步骤计数。

只有在HealthKit中有新的步数时,

HKObserverQuery才会通知您,因此在会话结束时您需要重新查询总数。另一方面,HKStatisticsCollectionQueryHKAnchoredObjectQuery可以在会话运行时将结果传输到您的应用,这可能会提高性能。

最后,请注意简单地将HKQuantitySamples的值相加以计算总步数。来自多个来源的HealthKit数据可以及时重叠。例如,Apple Watch用户可以在HealthKit中拥有多个步骤源,这些步骤在他们戴着手表和携带手机的那一天中。因此,最好使用HKStatisticsQueryHKStatisticsCollectionQuery来计算总和,因为它可以避免重复计算重叠样本。