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

目前我正在尝试使用HKStatisticsQuery来获取特定时间间隔内的步数。 我正在通过自己shaking手机进行testing。 但是,我得到的结果似乎不是最近的结果,除非:

  1. 我打开Health.app ,保持它在后台运行,然后在我的应用程序中再次testing;
  2. 我打开UP app ,让它在后台运行,并在我的应用程序中再次做testing。

如果我强制退出Health.appUP app ,我的应用程序将无法再获取最新的数据。 因此,UP必须做我缺less的东西,但我找不到任何“重新加载”像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但查询不会得到更新。

编辑2:当我说“最近的步骤计数”我的意思是这样的: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") } 

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

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

因此,如果您希望观察样本types的更改,则应使用HKObserverQuery订阅更新,然后再次查询HealthKit以获取最新值。 更有效的方法是使用HKStatisticsCollectionQuery ,但是,它有一个更新处理程序,将被调用为匹配谓词变化的样本的统计信息。

最后,如果您只关注过去7天内最新的步数或距离,那么我build议您考虑直接使用CoreMotion.framework。