2016-02-29 2 views
0

Я пытаюсь получить значение сердечного ритма от датчика в режиме реального времени. В приведенном ниже коде активируется сеанс тренировки (я вижу его на часах), загорается датчик HR, поэтому он явно работает, но я не могу получить доступ к значению. Метод updateHeartRate() всегда возвращает «No HR detected». Кто-нибудь знает, как исправить проблему?Доступ к датчику частоты сердечных сокращений в 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? В противном случае ваш запрос, скорее всего, получит ошибку, описывающую проблему. Попробуйте проверить ошибку в обработчике начальных результатов и в блоках обработчика обновлений.

Смежные вопросы