2016-09-28 3 views
0

workoutSessionでデータを取得できました。watchkitのアプリ拡張でHKAnchoredObjectQueryです。そして私はheartRateを取得し、私のiPhoneにデータを表示したい。だから私はHKSampleQueryを使ってSimulator(時計とiPhone)を手に入れます。しかし、私はiPhoneと時計を使ってテストします。私のiPhoneはheartRateを1回だけ得ることができました。iPhoneが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

あなたは心拍数

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に表示するように更新したいと思っています。心拍数の統計データを収集するのは安定しています。しかし、私はなぜプログラムがシミュレータしかし、iPhoneでうまく動作するのか分かりません。 – Maxwell

+0

このコードを試してみましたか? –

+0

もちろん。プログラムに入ると、私は一度hearRateを得ることができました。プログラムの実行中にユーザーのheartRateを更新してデータを表示したい。今度は毎回データを取得した後にsleep(1)というコードをテストします。それは今働く。しかし、それはまだ不安定です。理由は私のコードがあまりにも悪いと思います。メモリリークなどの問題があります。 – Maxwell

関連する問題