HealthKit извлекает данные между интервалами

У меня небольшая проблема с пониманием HealthKit. Я хочу получить частоту пульса из HealthKit с определенным временем. Я делал это раньше (пока не заметил, что не могу получить данные, когда телефон заблокирован)

 func retrieveMostRecentHeartRateSample(completionHandler: (sample: HKQuantitySample) -> Void) {
    let sampleType = HKObjectType.quantityTypeForIdentifier(HKQuantityTypeIdentifierHeartRate)
    let predicate = HKQuery.predicateForSamplesWithStartDate(NSDate.distantPast() as! NSDate, endDate: NSDate(), options: HKQueryOptions.None)
    let sortDescriptor = NSSortDescriptor(key: HKSampleSortIdentifierStartDate, ascending: false)

    let query = HKSampleQuery(sampleType: sampleType, predicate: predicate, limit: 1, sortDescriptors: [sortDescriptor])
        { (query, results, error) in
            if error != nil {
                println("An error has occured with the following description: \(error.localizedDescription)")
            } else {
                let mostRecentSample = results[0] as! HKQuantitySample
                completionHandler(sample: mostRecentSample)
            }
        }
    healthKitStore.executeQuery(query)
}

var observeQuery: HKObserverQuery!

func startObservingForHeartRateSamples() {
    println("startObservingForHeartRateSamples")
    let sampleType = HKObjectType.quantityTypeForIdentifier(HKQuantityTypeIdentifierHeartRate)

    if observeQuery != nil {
        healthKitStore.stopQuery(observeQuery)
    }

    observeQuery = HKObserverQuery(sampleType: sampleType, predicate: nil) {
        (query, completionHandler, error) in

        if error != nil {
            println("An error has occured with the following description: \(error.localizedDescription)")
        } else {
           self.retrieveMostRecentHeartRateSample {
                (sample) in
                dispatch_async(dispatch_get_main_queue()) {
                let result = sample
                let quantity = result.quantity
                let count = quantity.doubleValueForUnit(HKUnit(fromString: "count/min"))
                println("sample: \(count)")
                heartChartDelegate?.updateChartWith(count)
                }
            }
        }
    }
    healthKitStore.executeQuery(observeQuery)
}

Этот код будет получать последний образец каждый раз при изменении HealthKit. Но, как я сказал ранее, он не обновляется, когда телефон заблокирован. Я пробовал использовать:

self.healthKitStore.enableBackgroundDeliveryForType(HKQuantityType.quantityTypeForIdentifier(HKQuantityTypeIdentifierHeartRate), frequency: HKUpdateFrequency.Immediate) { (success, error) in
if success{
   println("success")
} else {
   println("fail")
}            

}

Но это не сработало, и, как я узнал, была ошибка, из-за которой Apple сообщила, что работает не так, как они хотели. Думаю, это какая-то проблема безопасности.

Но потом я подумал, может быть, я могу запросить образцы между startTime и endTime. Например, у меня есть EndTime (2015-05-31 10:34:45 +0000) и StartTime (2015-05-31 10:34:35 +0000). Итак, мой вопрос в том, как я могу получить образцы частоты пульса между этими двумя временами.

Думаю, я должен сделать это в

HKQuery.predicateForSamplesWithStartDate(myStartTime, endDate: myEndTime, options: HKQueryOptions.None)

Но когда я попробовал, ничего не нашел. Может, я все неправильно понял ...

Я использую датчик частоты пульса на груди и знаю, что получаю некоторые значения в healthKit в начальное и конечное время.

Редактировать:

Хорошо, я попробовал, и он работает несколько раз, не всегда. У кого-то есть идея?

func fetchHeartRates(endTime: NSDate, startTime: NSDate){
    let sampleType = HKObjectType.quantityTypeForIdentifier(HKQuantityTypeIdentifierHeartRate)
    let predicate = HKQuery.predicateForSamplesWithStartDate(startTime, endDate: endTime, options: HKQueryOptions.None)
    let sortDescriptor = NSSortDescriptor(key: HKSampleSortIdentifierStartDate, ascending: false)

    let query = HKSampleQuery(sampleType: sampleType, predicate: predicate, limit: 100, sortDescriptors: [sortDescriptor])
        { (query, results, error) in
            if error != nil {
                println("An error has occured with the following description: \(error.localizedDescription)")
            } else {
                for r in results{
                    let result = r as! HKQuantitySample
                    let quantity = result.quantity
                    let count = quantity.doubleValueForUnit(HKUnit(fromString: "count/min"))
                    println("sample: \(count) : \(result)")
                }
            }
    }
    healthKitStore.executeQuery(query)
}

Изменить 2:

Это работало, но я не мог назвать это так, как я. Так что я получил его через пару секунд, и он работал нормально :)


person troligtvis    schedule 31.05.2015    source источник
comment
Вы помещаете этот код в свой AppDelegate? Я пытаюсь заставить работать наблюдателя, но независимо от того, какой тип я ввел, он никогда не сообщает мне, что что-то было добавлено или удалено :(.   -  person Brandon Shega    schedule 11.06.2015


Ответы (1)


... Но, как я сказал ранее, он не обновляется, когда телефон заблокирован ... Думаю, это какая-то проблема безопасности.

Ты прав.

Из справочника по структуре HealthKit:

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

Если вы хотите, чтобы ваше приложение получало уведомления о новых результатах, вам следует просмотреть Управление фоновой доставкой:

enableBackgroundDeliveryForType:frequency:withCompletion:

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

person Ford    schedule 01.06.2015