如何强制 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.app
或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")
几乎无缘无故地尝试秘密“触发”某种背景刷新。但这些尝试都没有奏效。
【问题讨论】:
【参考方案1】:HealthKit 并不总是有用户步数和行进距离的最新计数。它会定期导入这些值,这些值实际上来自 CoreMotion.framework,以响应某些事件。如果正在运行的应用程序有一个打开的HKObserverQuery
或HKStatisticsCollectionQuery
,那么 HealthKit 会将值流式传输到客户端,否则样本只是上次导入的快照。
因此,如果您想观察样本类型的变化,您应该使用 HKObserverQuery
订阅更新,然后再次查询 HealthKit 以获取最新值。不过,更有效的方法是使用HKStatisticsCollectionQuery
,它有一个更新处理程序,当匹配谓词的样本的统计信息发生变化时,该处理程序将被调用。
最后,如果您只对最近 7 天内的最新步数或行驶距离感兴趣,那么我建议您考虑直接使用 CoreMotion.framework。
【讨论】:
对不起,我没有说清楚。当视图重新加载 (viewWillAppear
) 时,我已经多次调用 HKStatisticsQuery
。
知道了。我将修改我的答案,以便在这种情况下更有帮助。
谢谢!我认为这是 Apple 的错误,但 HKStatisticsCollectionQuery
和 statisticsUpdateHandler
成功了。以上是关于如何强制 HKQuery 加载最近的步数?的主要内容,如果未能解决你的问题,请参考以下文章