Как заставить 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")
    }

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

1 ответ

Решение

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

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

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

Другие вопросы по тегам