Как заставить HKQuery загружать последние шаги?
В настоящее время я пытаюсь использовать 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.