Health处理多个步骤源的方式与HealthKit-swift不同

时间:2016-04-11 22:25:15

标签: ios iphone swift health-kit hkhealthstore

我的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)
    }

1 个答案:

答案 0 :(得分:10)

您的代码计算过多,因为它只是对HKSampleQuery的结果求和。示例查询将返回与给定谓词匹配的所有样本,包括来自多个源的重叠样本。如果您想使用HKSampleQuery准确计算用户的步数,则必须检测重叠样本并避免对其进行计数,这将是繁琐且难以正确执行的。

运行状况使用HKStatisticsQueryHKStatisticsCollectionQuery来计算汇总值。这些查询为您计算总和(以及其他聚合值),并且有效地执行此操作。但最重要的是,它们会重复重叠样本,以避免过度计数。

documentation for HKStatisticsQuery包含示例代码。