我正在尝试跟踪会话期间采取的用户步骤。这些会话的时间从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。

最佳答案

如果您只想计算用户的iPhone或Apple Watch记录的步数,我建议改用CMPedometer API,因为它将始终具有最新记录。但是,如果您仍然想使用HealthKit,则需要通过执行任何具有updateHandler属性(HKObserverQuery,或HKStatisticsCollectionQuery)。在会话开始时使用更新处理程序执行这些查询之一,以使HealthKit更频繁地导入步数。

HKObserverQuery仅在HealthKit中有新的步骤计数时通知您,因此在会话结束时,您需要重新查询总数。另一方面,HKStatisticsCollectionQueryHKAnchoredObjectQuery可以在会话运行时将结果流式传输到您的应用程序,这可能会提高性能。

最后,请注意仅对HKQuantitySamples的值求和以计算总步数。来自多个来源的HealthKit数据可能会在时间上重叠。例如,Apple Watch用户在一天中既佩戴手表又携带手机时,可以在HealthKit中获得多个步骤信息。因此,最好使用HKStatisticsQueryHKStatisticsCollectionQuery来计算总和,因为这样可以避免重复计算重叠的样本。

关于ios - iOS HealthKit跟踪 session 期间的用户步骤,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/37547197/

10-14 16:58