如何强制 HKQuery 加载最近的步数?

Posted

技术标签:

【中文标题】如何强制 HKQuery 加载最近的步数?【英文标题】:How to force a HKQuery to load the most recent steps counts? 【发布时间】:2014-12-01 07:11:55 【问题描述】:

目前我正在尝试使用HKStatisticsQuery 来获取某个时间间隔之间的步数。我正在通过shaking 自己的电话进行测试。但是,我得到的结果似乎不是最新的,除非:

    我打开Health.app,让它在后台运行,然后在我的应用程序中再次进行测试; 我打开UP app,让它在后台运行,然后在我的应用中再次进行测试。

如果我强制退出Health.appUP app,我的应用程序将无法再次获取最新数据。所以 UP 一定在做我错过的事情,但我在HKHealthStore 中找不到任何类似“重新加载”的方法,或者在HKQuery/HKStatisticsQuery 中找不到任何相关选项。

我使用的代码非常简单,如下所示。我想知道是否有任何权限或我遗漏的任何东西。

    let predicate = HKQuery.predicateForSamplesWithStartDate(date_start, endDate: NSDate(), options: HKQueryOptions.StrictStartDate)
    var type = HKObjectType.quantityTypeForIdentifier(HKQuantityTypeIdentifierDistanceWalkingRunning)
    var query = HKStatisticsQuery(quantityType: type,
        quantitySamplePredicate: predicate,
        options: .CumulativeSum | .SeparateBySource,
        completionHandler:  query, stats, error in ( /*logs here*/ ) )
    let healthStore = HKHealthStore()
    healthStore.executeQuery(query)

编辑:我也尝试将一些数据写入HealthKit,但查询没有得到更新。

Edit2:当我说“最近的步骤数”时,我的意思是:1. 执行 HKQuery; 2.摇手机; 3.再次执行HKQuery。运行上面的代码 2 次,我总是得到相同的结果,但是如果我将 Health.app 或 UP 应用程序留在后台,最新的查询会得到更新的结果。

我还尝试调用其他一些 API,例如:

    healthStore.enableBackgroundDeliveryForType(type, frequency:.Immediate, withCompletion:
        (success:Bool, error:NSError!) -> Void in
        let authorized = healthStore.authorizationStatusForType(type)
        LF.log("HEALTH callback success", success)
        LF.log("HEALTH callback authorized", type)
    )

    if HKHealthStore.isHealthDataAvailable() == false 
        LF.log("HEALTH data not available")
        return
     else 
        LF.log("HEALTH OK")
    

几乎无缘无故地尝试秘密“触发”某种背景刷新。但这些尝试都没有奏效。

【问题讨论】:

【参考方案1】:

HealthKit 并不总是有用户步数和行进距离的最新计数。它会定期导入这些值,这些值实际上来自 CoreMotion.framework,以响应某些事件。如果正在运行的应用程序有一个打开的HKObserverQueryHKStatisticsCollectionQuery,那么 HealthKit 会将值流式传输到客户端,否则样本只是上次导入的快照。

因此,如果您想观察样本类型的变化,您应该使用 HKObserverQuery 订阅更新,然后再次查询 HealthKit 以获取最新值。不过,更有效的方法是使用HKStatisticsCollectionQuery,它有一个更新处理程序,当匹配谓词的样本的统计信息发生变化时,该处理程序将被调用。

最后,如果您只对最近 7 天内的最新步数或行驶距离感兴趣,那么我建议您考虑直接使用 CoreMotion.framework。

【讨论】:

对不起,我没有说清楚。当视图重新加载 (viewWillAppear) 时,我已经多次调用 HKStatisticsQuery 知道了。我将修改我的答案,以便在这种情况下更有帮助。 谢谢!我认为这是 Apple 的错误,但 HKStatisticsCollectionQuerystatisticsUpdateHandler 成功了。

以上是关于如何强制 HKQuery 加载最近的步数?的主要内容,如果未能解决你的问题,请参考以下文章

如何按日期获取 Apple 健康数据?

如何强制 Android Studio 从欢迎屏幕开始?

Keras强制使用CPU

如何提高 Oracle 中仅加载最近 5 天内修改的项目的 SQL 性能?

如何更改最近应用列表显示的快照?

iOS获取健康步数从加速计到healthkit