在 Apple Watch 中访问心率传感器 - HealthKit 不会返回该值



我正在尝试从传感器实时获取心率值。下面的代码激活锻炼会话(我可以在手表上看到它),心率传感器亮起,所以它显然在工作,但我无法访问updateHeartRate()方法总是返回"未检测到心率"的值。有谁知道如何解决这个问题?

let healthStore = HKHealthStore()
var workoutActive = false
var workoutSession : HKWorkoutSession?
let heartRateUnit = HKUnit(fromString: "count/min")
var anchor = HKQueryAnchor(fromValue:
Int(HKAnchoredObjectQueryNoAnchor))
func workoutSession(workoutSession: HKWorkoutSession, didChangeToState toState: HKWorkoutSessionState, fromState: HKWorkoutSessionState, date: NSDate) {
    switch toState {
    case .Running:
        workoutDidStart(date)
    case .Ended:
        workoutDidEnd(date)
    default:
        print("Unexpected state (toState)")
    }
}
func workoutSession(workoutSession: HKWorkoutSession, didFailWithError error: NSError) {
    // Do nothing for now
    NSLog("Workout error: (error.userInfo)")
}
func workoutDidStart(date : NSDate) {
    print("Workout did start")
    if let query = createHeartRateStreamingQuery(date) {
        print("Using query")
        healthStore.executeQuery(query)
    } else {
        print("cannot start")
    }
}
func workoutDidEnd(date : NSDate) {
    if let query = createHeartRateStreamingQuery(date) {
        healthStore.stopQuery(query)
    } else {
    }
}
func startBtnTapped() {
    if (self.workoutActive) {
        //finish the current workout
        self.workoutActive = false
        print("Finishing Workout")
        if let workout = self.workoutSession {
            healthStore.endWorkoutSession(workout)
        }
    } else {
        //start a new workout
        self.workoutActive = true
        startWorkout()
        print("Starting Workout")
    }
}
func startWorkout() {
    self.workoutSession = HKWorkoutSession(activityType: HKWorkoutActivityType.CrossTraining, locationType: HKWorkoutSessionLocationType.Indoor)
    self.workoutSession?.delegate = self
    healthStore.startWorkoutSession(self.workoutSession!)
}
func createHeartRateStreamingQuery(workoutStartDate: NSDate) -> HKQuery? {
    let predicate = HKQuery.predicateForSamplesWithStartDate(workoutStartDate, endDate: nil, options: HKQueryOptions.None)
    print("Entered query")
    guard let quantityType = HKObjectType.quantityTypeForIdentifier(HKQuantityTypeIdentifierHeartRate) else { return nil }
    let heartRateQuery = HKAnchoredObjectQuery(type: quantityType, predicate: nil, anchor: anchor, limit: Int(HKObjectQueryNoLimit)) { (query, sampleObjects, deletedObjects, newAnchor, error) -> Void in
        self.updateHeartRate(sampleObjects)
        print("Query is configured")
    }
    heartRateQuery.updateHandler = {(query, samples, deleteObjects, newAnchor, error) -> Void in
        self.updateHeartRate(samples)
        print("Updating sample")
        print(samples)
    }
    return heartRateQuery
}

func updateHeartRate(samples: [HKSample]?) {
    print("Entered updateHR")
    guard let heartRateSamples = samples as? [HKQuantitySample] else {
        print("No HR detected")
        return
    }
    dispatch_async(dispatch_get_main_queue()) {
        print("Enter async")
        guard let sample = heartRateSamples.first else{return}
        let value = sample.quantity.doubleValueForUnit(self.heartRateUnit)
        print(String(UInt16(value)))

        // retrieve source from sample
        print(sample.sourceRevision.source.name)
    }
}

您是否请求授权从HealthKit读取心率样本?否则,您的查询很可能会收到描述问题的错误。尝试检查初始结果处理程序和更新处理程序块中的错误。

最新更新