iOS Apple HealthKit 仅 Apple Watch 步数数据

Posted

技术标签:

【中文标题】iOS Apple HealthKit 仅 Apple Watch 步数数据【英文标题】:iOS Apple HealthKit Apple Watch step data only 【发布时间】:2017-09-06 05:46:11 【问题描述】:

有没有办法从 HealthKit 数据库中只获取 Apple Watch 步数数据。我已经完成了 Swift 3 中的示例,并且有工作代码来获取 Apple 提供的合并数据,但其中包含来自 iPhone 和 Apple Watch 的步骤数据。

我还没有看到任何人能够将这两条数据分开的例子。我见过的每个例子都只给出了合并的步骤数据。我可以迭代步数数据源,但不能使用源标识符来获取特定日历时间段的步数数据。

我看到的所有 Swift 3 代码都遵循以下几行(Objective-C 代码遵循类似的功能):

    // Request the step count.
    let stepType = HKSampleType.quantityType(forIdentifier: HKQuantityTypeIdentifier.stepCount)

    //let predicate = HKQuery.predicateForObjects(from: watchsource)
    let predicate = HKQuery.predicateForSamples(withStart: startdate, end: enddate, options: [])

    // Order doesn't matter, as we are receiving a quantity.

    let sortDescriptor = NSSortDescriptor(key:HKSampleSortIdentifierEndDate, ascending:false)

    // Fetch the steps.
    let query = HKSampleQuery(sampleType:stepType!, predicate: predicate, limit: 0, sortDescriptors:[sortDescriptor])  query, results, error in
        var steps: Double = 0

        if results != nil 
            if results!.count > 0
            
                for result in results as! [HKQuantitySample]
                
                    steps += result.quantity.doubleValue(for: HKUnit.count())
                
             // if results
         // if results != nil

        completion(steps, error as NSError?)
     // HKSampleQuery()

    healthKitStore.execute(query)

上述代码作为正确 HealthKit 身份验证的一部分工作正常,我能够获取任何时间段的步骤数据。

然而,HKSampleQuery() 或其他衍生的 HealthKit 库调用似乎无法用于特定来源,即仅 Apple Watch 数据,而不需要 Apple Watch 本身上的应用程序来读取步骤数据。

是的,我知道人们可以读取 iPhone 计步器数据,然后从总步数中减去该数据,但计步器数据仅保留 7 天,如果时间段是一个月,这并没有多大用处。

有人解决了吗?

【问题讨论】:

不要使用 HKSampleQuery 来统计数量样本。 HKStatisticsQuery 将为您汇总它们并处理重叠数据,而您采用的方法却没有。 谢谢艾伦,我会按照您的建议研究统计方面的问题。干杯,莱因霍尔德。 【参考方案1】:

我遇到了同样的问题。我想为 iPhone 和 Apple Watch 单独计算步数。

这是我实现这一目标的方法。

首先,我们需要一个设备谓词来仅获取 Apple watch 结果。

let watchPredicate = HKQuery.predicateForObjects(withDeviceProperty: HKDevicePropertyKeyModel, allowedValues: ["Watch"])

现在我们可以使用这个谓词查询样本,我们将只获得 Apple watch 条目。

我们还可以在查询中包含更多谓词,使用NSCompoundPredicate

【讨论】:

谢谢。这正是我所需要的。【参考方案2】:

另一种方法是获取所有样本,然后按数据源(即 iPhone、Apple Watch 和第三方应用)对步数值进行分组。

private lazy var store = HKHealthStore()

private func queryStepsCont(startDate: Date,
                            endDate: Date,
                            result: @escaping (Result<[(source: String, count: Int)], Error>) -> Void) 
    guard let type = HKObjectType.quantityType(forIdentifier: .stepCount) else 
        result(.failure(IntegrationsServiceError.preconditionFail))
        return
    
    let datePredicate = HKQuery.predicateForSamples(withStart: startDate, end: endDate)

    let filteredByDateStepsCountQuery = HKSampleQuery(sampleType: type,
                                                      predicate: datePredicate,
                                                      limit: Int(HKObjectQueryNoLimit),
                                                      sortDescriptors: [])  _, samples, error in
        if let error = error 
            result(.failure(error))
            return
        
        let sourceNameStepsCount = Dictionary(grouping: samples ?? [])  sample in
            sample.sourceRevision.source.name
        .map  sourceNameSamples -> (String, Int) in
            let (sourceName, sourceSamples) = sourceNameSamples
            let stepsCount = sourceSamples
                .compactMap  ($0 as? HKQuantitySample)?.quantity.doubleValue(for: .count()) 
                .reduce(0, +)
            return (sourceName, Int(stepsCount))
        
        result(.success(sourceNameStepsCount))
    
    store.execute(filteredByDateStepsCountQuery)

【讨论】:

以上是关于iOS Apple HealthKit 仅 Apple Watch 步数数据的主要内容,如果未能解决你的问题,请参考以下文章

React Native App - RN 与 Apple HealthKit

React Native App - RN 与 Apple HealthKit

App Store Connect 操作错误:密钥 com.apple.developer.healthkit.access 的 ITMS-90164 []

如何通过 healthkit 使用 Apple Watch 心率更新 iOS 应用程序? (HealthKit 同步)

Apple Healthkit 和 iOS 7 部署目标

如果您使用的是 Apple Watch,是不是需要先打开 Health App 同步数据,然后再打开自己的 healthkit 应用程序获取最新数据?