目前我正在尝试使用HKStatisticsQuery
来获取某个时间间隔之间的步数。我自己在做shaking
电话测试。但是,似乎我得到的结果不是最新的,除非:
- 我打开
Health.app
,让它在后台运行,然后在我的应用程序中再次进行测试; - 我打开
UP app
,让它在后台运行,然后在我的应用程序中再次进行测试。
如果我强制退出Health.app
or 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")
}
几乎没有理由,而是试图秘密地“触发”某种背景刷新。但这些尝试都没有奏效。