В настоящее время я пытаюсь использовать 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")
}
Почти без причины, но попробуйте тайно «запустить» какое-то фоновое обновление. Но ни одна из этих попыток не сработала.