5

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

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

如果我强制退出Health.appor UP 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")
    }

几乎没有理由,而是试图秘密地“触发”某种背景刷新。但这些尝试都没有奏效。

4

1 回答 1

12

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

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

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

于 2014-12-02T00:12:51.453 回答