为什么我的iPhone无法从Apple Watch获得heartRate数据,但手表扩展可以吗?

时间:2016-09-28 06:32:38

标签: ios iphone swift watch-os-2 health-kit

我可以在HKAnchoredObjectQuery应用扩展程序中通过workoutSession和watchkit获取数据。我还想获得heartRate并在我的iPhone上显示数据。所以我使用HKSampleQuery通过模拟器(手表和iPhone)。但是当我使用iPhone并观看测试时。我的iPhone只能获得一次heartRate。

//代码

    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)
}

1 个答案:

答案 0 :(得分: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)
}