首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >为什么我的iPhone不能从Apple中获取heartRate数据,但是手表扩展可以吗?

为什么我的iPhone不能从Apple中获取heartRate数据,但是手表扩展可以吗?
EN

Stack Overflow用户
提问于 2016-09-28 06:32:37
回答 1查看 140关注 0票数 0

我可以通过workoutSession和HKAnchoredObjectQuerywatchkit应用扩展中获取数据。我还想得到heartRate并在我的iPhone上显示数据。所以,当我使用HKSampleQuery和watch进行测试时,我使用iPhone来获得模拟器(watch和iPhone).But。我的iPhone只能得到heartRate一次。

//代码

代码语言:javascript
复制
    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)
}
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-09-28 08:25:00

你可以试试这个来获取heartRate

代码语言:javascript
复制
    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
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/39739635

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档