Как заставить HKQuery загружать самые последние шаги?

В настоящее время я пытаюсь использовать HKStatisticsQuery для подсчета шагов между определенным интервалом времени. Я сам тестирую shaking телефон. Однако кажется, что результат, который я получаю, не самый последний, если только:

  1. Я открываю Health.app, продолжаю работать в фоновом режиме и снова выполняю тест в своем приложении;
  2. Я открываю 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")
    }

Почти без причины, но попробуйте тайно «запустить» какое-то фоновое обновление. Но ни одна из этих попыток не сработала.


person superarts.org    schedule 01.12.2014    source источник


Ответы (1)


HealthKit не всегда имеет актуальную информацию о шагах пользователя и пройденном расстоянии. Он периодически и в ответ на определенные события импортирует эти значения, которые на самом деле поступают из CoreMotion.framework. Если работающее приложение имеет открытый HKObserverQuery или HKStatisticsCollectionQuery, тогда HealthKit будет передавать значения клиенту, но в противном случае образцы будут просто снимком из последнего импорта.

Поэтому, если вы хотите наблюдать за изменениями для типа выборки, вы должны подписаться на обновления, используя HKObserverQuery, а затем снова запросить HealthKit для получения последних значений. Однако более эффективным подходом было бы использование HKStatisticsCollectionQuery, у которого есть обработчик обновления, который будет вызываться при изменении статистики для выборок, соответствующих предикатам.

Наконец, если вас интересуют только актуальные данные о количестве шагов или пройденном расстоянии не более чем за последние 7 дней, я рекомендую вместо этого напрямую использовать CoreMotion.framework.

person Allan    schedule 02.12.2014
comment
Извините, я не ясно выразился. Я вызывал HKStatisticsQuery несколько раз, когда представление перезагружается (viewWillAppear). - person superarts.org; 03.12.2014
comment
Понятно. Я собираюсь изменить свой ответ, чтобы быть более полезным в этом случае. - person Allan; 05.12.2014
comment
Спасибо! Я думаю, что это ошибка Apple, но HKStatisticsCollectionQuery с statisticsUpdateHandler сделали свое дело. - person superarts.org; 05.12.2014