2016-02-29 103 views
0

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

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 queury") 
    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) 

    } 
} 

回答

0

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

相关问题