从HealthKit(HKStatistics)获取最新(最新)Step值

时间:2018-10-19 06:36:25

标签: ios swift health-kit

我想获取Health(Kit)App条目的最后一个(又是最近的)值。 例如,最新的HKSource条目中的步长值。

我认为可以在查询建筑物中使用HKStatisticsOptions.discreteMostRecent属性。

当前结果

代码工作正常,没有错误。我的统计信息具有正确的开始和结束日期(如果只有一个值可用,则开始和结束日期相同)。

问题在于statistics.sources列表始终为nil,就像statistics.mostRecentQuantity()也会返回nil。

所有与HKSource不相关的总和运算sumQuantity()都可以正常工作。

其他Stackoverflow帖子

我会尝试使用限制为1且排序描述为from this post的查询,但是我也需要在详细视图中显示其他历史值。这就是为什么我认为我可以只请求数量的日期框架,将最新的作为我的“最后一个”,而将其他所有作为我的历史记录表视图。

代码

func requestMeasurements(completion: @escaping (HKStatistics?, AppError?) -> Void)
    {
        let healthStore = HKHealthStore()

        // Check if HK is available.
        guard HKHealthStore.isHealthDataAvailable() else
        {
            completion(nil, AppError.healthInformationNotAvailable)
            return
        }

        // Check if HK information is available
        guard let quantitiyType = HKQuantityType.quantityType(forIdentifier: .stepCount) else
        {
            completion(nil, AppError.requestedHealthDataTypeNotAvailable)
            return
        }

        let typeSet: Set = [quantitiyType]

        // Request user access to HK and especially this type
        healthStore.requestAuthorization(toShare: nil, read: typeSet)
        { success, error in

            // Ensure that the app has the required access
            if success == false
            {
                print(error?.localizedDescription ?? "<no error description>")
                completion(nil, AppError.noAccessToRequestedInformation)
                return
            }

            // Build query
            let now = Date()
            let lastSync = Calendar.current.startOfDay(for: now)
            let prediction = HKQuery.predicateForSamples(withStart: lastSync, end: now, options: .strictStartDate)

            let query = HKStatisticsQuery(quantityType: quantitiyType, quantitySamplePredicate: prediction, options: HKStatisticsOptions.discreteMostRecent)
            { _, statistics, error in
                // Check for error.
                if let _error = error
                {
                    print("An error occured: \(_error.localizedDescription)")
                    completion(nil, AppError.requestingFailed)
                    return
                }

                // Check if statistics are available.
                guard let _statistics = statistics else
                {
                    completion(nil, AppError.requestingFailed)
                    return
                }

                completion(_statistics, nil)
            }

            // Execure query
            healthStore.execute(query)
        }

1 个答案:

答案 0 :(得分:1)

如果您只想使用数量,等等。只需使用HKSampleQuery而不是HKStatisticsQuery

此后,您只需要将HKSample的结果列表转换为[HKQuantitySample]

现在您有了开始和结束日期,还有quantity