我的Swift iOS应用程序与HealthKit连接,向用户显示他们当天到目前为止所采取的步骤。在大多数情况下,这是成功的。当唯一的步骤来源是iPhone的内置计步器功能记录的步骤时,一切正常,我的应用程序显示的步数与Health应用程序的步数一致。然而,当我的个人iPhone上有多个数据源时,我的Pebble Time智能手表和iPhone的计步器都向Health提供了步骤 - 我的应用程序吓坏了,记录了两者的所有步骤。 iOS Health应用程序根据重复步骤(因为我的iPhone和我的Pebble报告每60秒执行一次健康状况)可以做到这一点,并显示准确的每日步数,我的应用程序从HealthKit获取的数据包括来自两者的所有步骤来源,造成很大的不准确。
如何才能点击Health应用程序的最终结果,其中步数是准确的,而不是点击HealthKit的过度膨胀步骤数据流?
更新:以下是我用来获取每日健康数据的代码:
func recentSteps2(completion: (Double, NSError?) -> () )
{
checkAuthorization() // checkAuthorization just makes sure user is allowing us to access their health data.
let type = HKSampleType.quantityTypeForIdentifier(HKQuantityTypeIdentifierStepCount) // The type of data we are requesting
let date = NSDate()
let cal = NSCalendar(calendarIdentifier: NSCalendarIdentifierGregorian)!
let newDate = cal.startOfDayForDate(date)
let predicate = HKQuery.predicateForSamplesWithStartDate(newDate, endDate: NSDate(), options: .None) // Our search predicate which will fetch all steps taken today
// The actual HealthKit Query which will fetch all of the steps and add them up for us.
let query = HKSampleQuery(sampleType: type!, predicate: predicate, limit: 0, sortDescriptors: nil) { query, results, error in
var steps: Double = 0
if results?.count > 0
{
for result in results as! [HKQuantitySample]
{
steps += result.quantity.doubleValueForUnit(HKUnit.countUnit())
}
}
completion(steps, error)
}
storage.executeQuery(query)
}
答案 0 :(得分:10)
您的代码计算过多,因为它只是对HKSampleQuery
的结果求和。示例查询将返回与给定谓词匹配的所有样本,包括来自多个源的重叠样本。如果您想使用HKSampleQuery
准确计算用户的步数,则必须检测重叠样本并避免对其进行计数,这将是繁琐且难以正确执行的。
运行状况使用HKStatisticsQuery
和HKStatisticsCollectionQuery
来计算汇总值。这些查询为您计算总和(以及其他聚合值),并且有效地执行此操作。但最重要的是,它们会重复重叠样本,以避免过度计数。