Запрос значения пульса из приложения HealthKit сбои - PullRequest
0 голосов
/ 22 февраля 2019

Я пытаюсь отображать частоту сердечных сокращений в виде ярлыка при каждом нажатии кнопки.Я хочу иметь возможность выбрать конкретный день, когда будет напечатан пульс. Я хочу, чтобы я мог отправить эту конкретную норму по электронной почте.Но мой главный вопрос - я постоянно получаю «Тема 1: сигнал SIGABRT» всякий раз, когда я нажимаю кнопку.Кажется, что все связано, как и предполагалось.

import UIKit
import HealthKit

class ViewController: UIViewController {
let healthStore = HKHealthStore()

override func viewDidLoad() {
    super.viewDidLoad()
    // Do any additional setup after loading the view, typically from a nib.
}

@IBAction func authoriseHealthKitAccess(_ sender: Any) {
    let healthKitTypes: Set = [

        HKObjectType.quantityType(forIdentifier: HKQuantityTypeIdentifier.heartRate)!
    ]
    healthStore.requestAuthorization(toShare: healthKitTypes, read: healthKitTypes) { (_, _) in
        print("Authorising")
    }
    healthStore.requestAuthorization(toShare: healthKitTypes, read: healthKitTypes) { (bool, error) in
        if let e = error {
            print("oops something went wrong during authorisation \(e.localizedDescription)")
        } else {
            print("User has completed the authorization process")
        }
    }
}

func getTodaysHeartRate(completion: @escaping (Double) -> Void) {

    let heartRateType = HKQuantityType.quantityType(forIdentifier: .heartRate)!

    let now = Date()
    let startOfDay = Calendar.current.startOfDay(for: now)
    let predicate = HKQuery.predicateForSamples(withStart: startOfDay, end: now, options: .strictStartDate)

    let query = HKStatisticsQuery(quantityType: heartRateType, quantitySamplePredicate: predicate, options: .cumulativeSum) { (_, result, error) in
        var resultCount = 0
        guard let result = result else {
            print("Failed to fetch heart rate")
            completion(Double(resultCount))
            return
        }
        if let sum = result.sumQuantity() {
            resultCount = Int(sum.doubleValue(for: HKUnit.count()))
        }

        DispatchQueue.main.async {
            completion(Double(resultCount))
        }
    }
    healthStore.execute(query)
}

@IBOutlet weak var heartRate: UILabel!
@IBAction func getHeartRate(_ sender: Any) {
    getTodaysHeartRate { (result) in
        print("\(result)")
        DispatchQueue.main.async {
            self.heartRate.text = "\(result)"
        }
}
}

}

Консоль сбоев: 2019-02-22 14: 29: 28.314380-0400 HeartRateSample [16416: 2767191] * Завершение работы приложения из-за невосприимчивостиисключение 'NSInvalidArgumentException', причина: 'Статистика вариант HKStatisticsOptionCumulativeSum не совместим с дискретным типом данных HKQuantityTypeIdentifierHeartRate' * стек Первый бросок вызова: (0x213d51ea4 0x212f21a50 0x213c58484 0x2265cf760 0x226575d60 0x22657e298 0x1035e4dc8 0x1035f382c 0x22657dcb0 0x226534bd4 0x102749ebc 0x10274a8dc 0x10274ae3c 0x24103e314 0x240acbd54 0x240acc074 0x240acb074 0x241077a6c 0x241078cd0 0x241057fcc0x241126e38 0x241129830 0x241122320 0x213ce20e0 0x213ce2060 0x213ce1944 0x213cdc810 0x213cdc0e0 0x215f55584 0x24103cc00 0x10274d138 0x21379abb4 * исключение * исключение * * *

1 Ответ

0 голосов
/ 22 февраля 2019

Вы на правильном пути.Ошибка, которую вы получаете, проста.Частота сердечных сокращений является дискретной опцией и не совместима с опцией статистики Cumulative Sum.

Из документации:

Нельзя объединить дискретный вариант с накопительным.

Нажмите здесь, чтобыузнать больше о HKStatisticsOptions

Решение:

Вам необходимо использовать .discreteMostRecent вместо .cumulativeSum

Обновленокод для внесения необходимых изменений:

@available(iOS 12.0, *)
    func getTodaysHeartRate(completion: @escaping (Double) -> Void) {
        let heartRateType = HKQuantityType.quantityType(forIdentifier: .heartRate)!
        let now = Date()
        let startOfDay = Calendar.current.startOfDay(for: now)
        let predicate = HKQuery.predicateForSamples(withStart: startOfDay, end: now, options: .strictStartDate)

    // replaced options parameter .cumulativeSum with .discreteMostRecent
    let query = HKStatisticsQuery(quantityType: heartRateType, quantitySamplePredicate: predicate, options: .discreteMostRecent) { (_, result, error) in
        var resultCount = 0
        guard let result = result else {
            print("Failed to fetch heart rate")
            completion(Double(resultCount))
            return
        }

        // More changes here in order to get bpm value
        guard let beatsPerMinute: Double = result.mostRecentQuantity()?.doubleValue(for: HKUnit.count().unitDivided(by: HKUnit.minute())) else { return }
        resultCount = Int(beatsPerMinute)

        DispatchQueue.main.async {
            completion(Double(resultCount))
        }
    }
    healthStore.execute(query)
}

Примечание: опция .discreteMostRecent доступна только в iOS 12 или более поздней версии.

...