如何获取过去7天的健康数据

时间:2018-03-10 15:33:01

标签: ios swift date health-kit hkhealthstore

我试图获取过去7天的步骤,但我找不到怎么做。 我想要收到的是一个包含7个元素的数组,其中每个元素都是一天,其中包含相应的总步骤。我目前有这个代码,它获得了今天的步骤:

getTodaysSteps { (steps) in
        self.stepsNumber = Int(steps)
    }

我将这个函数称为:

{{1}}

3 个答案:

答案 0 :(得分:3)

尝试使用HKStatisticsCollectionQuery,它将为您执行日期数学运算并自动存储结果。这是一个应该提供过去7天的步数的示例:

    let stepsQuantityType = HKQuantityType.quantityType(forIdentifier: .stepCount)!

    let now = Date()
    let exactlySevenDaysAgo = Calendar.current.date(byAdding: DateComponents(day: -7), to: now)!
    let startOfSevenDaysAgo = Calendar.current.startOfDay(for: exactlySevenDaysAgo)
    let predicate = HKQuery.predicateForSamples(withStart: startOfSevenDaysAgo, end: now, options: .strictStartDate)

    let query = HKStatisticsCollectionQuery.init(quantityType: stepsQuantityType,
                                                 quantitySamplePredicate: predicate,
                                                 options: .cumulativeSum,
                                                 anchorDate: startOfSevenDaysAgo,
                                                 intervalComponents: DateComponents(day: 1))

    query.initialResultsHandler = { query, results, error in
        guard let statsCollection = results else {
            // Perform proper error handling here...
        }

        statsCollection.enumerateStatistics(from: startOfSevenDaysAgo, to: now) { statistics, stop in

            if let quantity = statistics.sumQuantity() {
                let stepValue = quantity.doubleValueForUnit(HKUnit.countUnit())
                // ...
            }
        }
    }

答案 1 :(得分:1)

这里有更简单的解决方案。

func getTotalSteps(forPast days: Int, completion: @escaping (Double) -> Void) {
    // Getting quantityType as stepCount
    guard let stepsQuantityType = HKObjectType.quantityType(forIdentifier: .stepCount) else {
        print("*** Unable to create a step count type ***")
        return
    }

    let now = Date()
    let startDate = Calendar.current.date(byAdding: DateComponents(day: -days), to: now)
    let predicate = HKQuery.predicateForSamples(withStart: startDate, end: now, options: .strictStartDate)

    let query = HKStatisticsQuery(quantityType: stepsQuantityType, quantitySamplePredicate: predicate, options: .cumulativeSum) { _, result, _ in
        guard let result = result, let sum = result.sumQuantity() else {
            completion(0.0)
            return
        }
        completion(sum.doubleValue(for: HKUnit.count()))
    }
    execute(query)
}

现在调用只需使用以下代码:

HKHealthStore().getTotalSteps(forPast: 30) { totalSteps in
    print(totalSteps)
}

答案 2 :(得分:0)

您必须实施的唯一更改是将您提供的speech对象作为% if (object.amount > 12): #some code % endif 参数更改为Date。您可以使用startWith创建一个代表7天前一天开始的HKStatisticsQuery对象,然后使用Date完全返回7天,然后在该对象上调用Calendar.date(byAdding:,to:)

startOfDay(for:)