如何强制HKQuery加载最新的步骤计数?

sup*_*org 4 objective-c ios healthkit

目前我正试图用HKStatisticsQuery一段时间间隔来计算步数.我正在通过shaking手机进行测试.但是,似乎我得到的结果不是最近的结果,除非:

  1. 我打开它Health.app,让它在后台运行,然后在我的应用程序中再次进行测试;
  2. 我打开它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)
Run Code Online (Sandbox Code Playgroud)

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

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

我还尝试调用其他一些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")
    }
Run Code Online (Sandbox Code Playgroud)

几乎没有理由,但试图暗中"触发"某种背景刷新.但这些尝试都没有奏效.

All*_*lan 11

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

因此,如果您希望观察样本类型的更改,则应使用an订阅更新HKObserverQuery,然后再次查询HealthKit以获取最新值.但是,更有效的方法是使用HKStatisticsCollectionQuery具有更新处理程序的更新处理程序,该处理程序将作为匹配谓词的样本的统计信息进行更改.

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