从HealthKit查询心率值会导致应用崩溃

问题描述 投票:2回答:1

每按一下按钮,我都会尝试将心率显示为标签。我希望能够在打印心率时选择特定日期我希望能够通过电子邮件通过电子邮件发送此特定费率。但我的主要问题是,每当我点击我的按钮时,我就会不断地获得“线程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 0x241057fcc 0x241126e38 0x241129830 0x241122320 0x213ce20e0 0x213ce2060 0x213ce1944 0x213cdc810 0x213cdc0e0 0x215f55584 0x24103cc00 0x10274d138 0x21379abb4)的libc ++ abi.dylib:与类型的未捕获的异常终止NSException(lldb)

ios swift health-kit
1个回答
3
投票

你走在正确的轨道上。你得到的错误是直截了当的。心率是一个离散选项,与统计选项累积和不兼容。

来自文档:

您不能将离散选项与累积选项组合使用。

Click here to learn more about 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或更高版本。

© www.soinside.com 2019 - 2024. All rights reserved.