2016-09-28 2 views
0

Я мог бы получить данные по workoutSession и HKAnchoredObjectQuery в watchkit расширение приложения. И я также хочу получить heartRate и отобразить данные на моем iPhone. Поэтому я использую HKSampleQuery, чтобы получить Simulator (смотреть и iPhone). Но когда я использую iPhone и наблюдаю за тестированием. Мой iPhone может получить heartRate только один раз.Почему мой iPhone не получает данные HeartRate от Apple Watch, но расширение для часов может?

// Код

override func viewDidLoad() { 
    super.viewDidLoad() 
    // Do any additional setup after loading the view, typically from a nib. 
    guard let sampleType = HKObjectType.quantityTypeForIdentifier(HKQuantityTypeIdentifierHeartRate) else { return } 
    // 1. Build the Predicate 
    let past = NSDate.distantPast() as NSDate 
    let now = NSDate() 
    let mostRecentPredicate = HKQuery.predicateForSamplesWithStartDate(past, endDate:now, options: .None) 

    // 2. Build the sort descriptor to return the samples in descending order 
    let sortDescriptor = NSSortDescriptor(key:HKSampleSortIdentifierStartDate, ascending: false) 
    // 3. we want to limit the number of samples returned by the query to just 1 (the most recent) 

    // 4. Build samples query 
    let sampleQuery = HKSampleQuery(sampleType: sampleType, predicate: mostRecentPredicate, limit: Int(HKObjectQueryNoLimit), sortDescriptors: [sortDescriptor]) 
    { (sampleQuery, HKSample, error) -> Void in 

     // Get the samples 
     guard let heartRateSamples = HKSample as? [HKQuantitySample] else {return} 
     if(heartRateSamples.count > 0){ 
      let count : Double = Double(heartRateSamples.count) 
      var sum = 0.0; 
      for quantitySample in heartRateSamples 
      { 
       let value = quantitySample.quantity.doubleValueForUnit(self.heartRateUnit); 
       sum += value; 
      } 

      let avg = sum/count; 
      self.HeartRateSum.text = String(sum) 
      self.Count.text = String(count) 
      self.SilentHeartRate.text = String(avg) 
     } 

    } 
    // 5. Execute the Query 
    self.healthStore.executeQuery(sampleQuery) 

    dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), { 
     sleep(15) 
     while(true){ 
      self.getRecentHeartRate() 
     } 

    }); 
} 

func getRecentHeartRate() ->Void{ 
    guard let sampleType = HKObjectType.quantityTypeForIdentifier(HKQuantityTypeIdentifierHeartRate) else { return } 
    let past = NSDate.distantPast() as NSDate 
    let now = NSDate() 
    let limit = 1 
    let mostRecentPredicate = HKQuery.predicateForSamplesWithStartDate(past, endDate:now, options: .None) 

    // 2. Build the sort descriptor to return the samples in descending order 
    let sortDescriptor = NSSortDescriptor(key:HKSampleSortIdentifierStartDate, ascending: false) 

    let sampleQuery = HKSampleQuery(sampleType: sampleType, predicate: mostRecentPredicate, limit: limit, sortDescriptors: [sortDescriptor]) 
    { (sampleQuery, HKSample, error) -> Void in 

     // Get the samples 
     guard let heartRateSample = HKSample as? [HKQuantitySample] else {return} 
     guard let recentHeartRate = heartRateSample.first else{return} 
     let value = recentHeartRate.quantity.doubleValueForUnit(self.heartRateUnit) 
     dispatch_async(dispatch_get_main_queue()) { 
      self.heartRate.text = String(UInt16(value)) 
     } 
    } 
    self.healthStore.executeQuery(sampleQuery) 
} 

ответ

0

Вы можете попробовать это для получения HeartRate

func readHeartRate() { 

    let nowDate = NSDate() 
    let calendar = NSCalendar.autoupdatingCurrentCalendar() 
    let yearMonthDay: NSCalendarUnit = [NSCalendarUnit.Year, NSCalendarUnit.Month, NSCalendarUnit.Day] 
    let components: NSDateComponents = calendar.components(yearMonthDay , fromDate: nowDate) 
    let beginOfDay: NSDate = calendar.dateFromComponents(components)! 

    readHRbyDate(HKObjectQueryNoLimit, startDate: beginOfDay, endDate: nowDate) { (hrData, error) in 
     print("heart Rate") 
     // print(hrData) 
    } 
} 

func readHRbyDate(latestXSamples: Int, startDate: NSDate, endDate: NSDate, completion: (((String, CGFloat), NSError!) -> Void)!) { 

    let sampleType = HKObjectType.quantityTypeForIdentifier(HKQuantityTypeIdentifierHeartRate) 
    let predicate = HKQuery.predicateForSamplesWithStartDate(startDate, endDate: endDate, options: HKQueryOptions.None) 
    let sortDescriptor = NSSortDescriptor(key: HKSampleSortIdentifierStartDate, ascending: true) 

    var HRdata:(String,CGFloat) = ("N/A",0) 
    var bpm: Int = 0 

    var totalBPMforDay = [Int]() 
    var BPMCount: Int = 0 

    var sumBPM: Int = 0 

    let query = HKSampleQuery(sampleType: sampleType!, predicate: predicate, limit: latestXSamples, sortDescriptors: [sortDescriptor]) 
    { (query, results, error) in 
     if let queryError = error { 
      print("Problem fetching HR data") 
      completion(("nil",0.0),queryError) 
      return 
     }else{ 
      for result in results! { 
       bpm = Int(((result.valueForKeyPath("_quantity._value"))?.floatValue)! * 60.0) 
       totalBPMforDay += [Int(((result.valueForKeyPath("_quantity._value"))?.floatValue)! * 60.0)] 
       BPMCount = Int(totalBPMforDay.count) 
       sumBPM += Int(((result.valueForKeyPath("_quantity._value"))?.floatValue)! * 60.0) 

       let HRAvg = sumBPM/BPMCount 

       //HRdata = (self.getDayOfWeek(result.startDate),CGFloat(HRAvg)) 

       let dateFormatter = MyAPIClient.sharedClient.apiClientDateFormatter() // create your date formatter 
       HRdata = (dateFormatter.stringFromDate(result.startDate),CGFloat(HRAvg)) 

       print(HRdata, bpm) 
      } 
      if completion != nil { 
       completion(HRdata,nil) 
      } 
     } 
    } 

    executeQuery(query) 
} 
+0

Спасибо большое. Я хотел бы обновить недавнее сердце для отображения на Iphone. Устойчиво собирать статистические данные heartRate. Но я понятия не имею, почему программа хорошо работает на симуляторе, но Iphone. – Maxwell

+0

Вы пробовали этот код? –

+0

Конечно. Я могу получить hearRate один раз, когда я вхожу в программу. Я хочу обновить heartRate пользователя и отобразить данные, когда программа запущена. Теперь я проверяю свой код, сон (1) после получения данных каждый раз. Он работает сейчас. Но это все еще нестабильно. Я думаю, что причиной является мой код, который слишком худ. Есть утечка памяти или другая проблема. – Maxwell