如何从HealthKit Swift 4中每小时获取步骤计数

时间:2018-09-18 12:16:34

标签: ios swift4 health-kit hkhealthstore

我需要为用户在任何特定日期每小时执行的步骤绘制图形。但是,如果用户的步骤从今天下午3:58开始到今天下午4:10结束,那么这段时间内我只能得到一个HKStatistics对象。我无法将此数据分为两个样本,因为我需要在3-4 pm插槽和4-5 pm插槽中采取步骤。

  static func getSteps(date: Date, duration: DateComponents, completion: @escaping ([HKSample]) -> Void) {
        let quantityType : Set = [HKObjectType.quantityType(forIdentifier: HKQuantityTypeIdentifier.stepCount)!]

        let stepsQuantityType = HKQuantityType.quantityType(forIdentifier: .stepCount)!
        let startOfDay = Calendar.current.startOfDay(for: date)
        if let endOfDay = Calendar.current.date(byAdding: duration, to: startOfDay) {
            var interval = DateComponents()
            interval.hour = 1
            let predicate = HKQuery.predicateForSamples(withStart: startOfDay, end: endOfDay, options: .strictStartDate)

            let query = HKSampleQuery.init(sampleType:stepsQuantityType,
                                                 predicate: predicate,
                                                 limit: HKObjectQueryNoLimit,
                                                 sortDescriptors: nil,
                                                 resultsHandler: { (query, results, error) in
                                                    guard let result = results else {

                                                                            return
                                                                        }
                                                   // print("result healthkit",result.description)
                                                    //print("Total count:",)
                                                    completion(result)
            })

            healthStore.execute(query)
        }
    }

2 个答案:

答案 0 :(得分:2)

请勿使用HKSampleQuery制图数量​​类型。 HKStatisticsCollectionQuery是为此目的而设计的,它将为您拆分落入图表单独区域的样本。有关如何构建查询和使用查询结果的示例,请参见documentation

答案 1 :(得分:1)

是的,您不能拆分样本。这就是所有可用的信息。步骤不是逐步存储的;它们被汇总为块,以减少功耗和存储要求(主要是功耗;在硬件中累积值并定期读取该值比每检测到一个步骤查询一次实时时钟要容易得多。

为了执行您正在讨论的事情,您需要对这段时间内的平均步伐进行平均。因此,如果在3:58p到4:07p的时间段内有100步,则平均为10步/分钟,则将20步分配给3p-4p块,将80步分配给4p-5p块。这是您拥有的最佳信息。