我在掌握健康工具包方面有点问题。我想从HealthKit获得特定时间的心率。
我以前就这样做过(直到我注意到手机锁定时无法获取数据)

 func retrieveMostRecentHeartRateSample(completionHandler: (sample: HKQuantitySample) -> Void) {
    let sampleType = HKObjectType.quantityTypeForIdentifier(HKQuantityTypeIdentifierHeartRate)
    let predicate = HKQuery.predicateForSamplesWithStartDate(NSDate.distantPast() as! NSDate, endDate: NSDate(), options: HKQueryOptions.None)
    let sortDescriptor = NSSortDescriptor(key: HKSampleSortIdentifierStartDate, ascending: false)

    let query = HKSampleQuery(sampleType: sampleType, predicate: predicate, limit: 1, sortDescriptors: [sortDescriptor])
        { (query, results, error) in
            if error != nil {
                println("An error has occured with the following description: \(error.localizedDescription)")
            } else {
                let mostRecentSample = results[0] as! HKQuantitySample
                completionHandler(sample: mostRecentSample)
            }
        }
    healthKitStore.executeQuery(query)
}

var observeQuery: HKObserverQuery!

func startObservingForHeartRateSamples() {
    println("startObservingForHeartRateSamples")
    let sampleType = HKObjectType.quantityTypeForIdentifier(HKQuantityTypeIdentifierHeartRate)

    if observeQuery != nil {
        healthKitStore.stopQuery(observeQuery)
    }

    observeQuery = HKObserverQuery(sampleType: sampleType, predicate: nil) {
        (query, completionHandler, error) in

        if error != nil {
            println("An error has occured with the following description: \(error.localizedDescription)")
        } else {
           self.retrieveMostRecentHeartRateSample {
                (sample) in
                dispatch_async(dispatch_get_main_queue()) {
                let result = sample
                let quantity = result.quantity
                let count = quantity.doubleValueForUnit(HKUnit(fromString: "count/min"))
                println("sample: \(count)")
                heartChartDelegate?.updateChartWith(count)
                }
            }
        }
    }
    healthKitStore.executeQuery(observeQuery)
}

此代码将在每次更改healthkit时获取最新的示例。但正如我之前所说,当手机被锁定时,它不会更新。我尝试使用:
self.healthKitStore.enableBackgroundDeliveryForType(HKQuantityType.quantityTypeForIdentifier(HKQuantityTypeIdentifierHeartRate), frequency: HKUpdateFrequency.Immediate) { (success, error) in
if success{
   println("success")
} else {
   println("fail")
}

}
但这并没有起作用,当我发现有一个bug,苹果说它不能按他们想要的方式工作。我猜这是安全问题。
但后来我想,也许我可以在开始时间和结束时间之间请求样本。例如,我有endtime(2015-05-31 10:34:45+0000)和starttime(2015-05-31 10:34:35+0000)。
所以我的问题是如何在这两次之间获得心率样本。
我想我必须在
HKQuery.predicateForSamplesWithStartDate(myStartTime, endDate: myEndTime, options: HKQueryOptions.None)

但当我尝试的时候,却什么也没找到。也许我搞错了…
我在胸部使用心率监测器,我知道在开始和结束时间内,我在HealthKit中获得了一些价值。
编辑:
好吧,我试过了,它有时也会起作用,不总是。有人有主意吗?
func fetchHeartRates(endTime: NSDate, startTime: NSDate){
    let sampleType = HKObjectType.quantityTypeForIdentifier(HKQuantityTypeIdentifierHeartRate)
    let predicate = HKQuery.predicateForSamplesWithStartDate(startTime, endDate: endTime, options: HKQueryOptions.None)
    let sortDescriptor = NSSortDescriptor(key: HKSampleSortIdentifierStartDate, ascending: false)

    let query = HKSampleQuery(sampleType: sampleType, predicate: predicate, limit: 100, sortDescriptors: [sortDescriptor])
        { (query, results, error) in
            if error != nil {
                println("An error has occured with the following description: \(error.localizedDescription)")
            } else {
                for r in results{
                    let result = r as! HKQuantitySample
                    let quantity = result.quantity
                    let count = quantity.doubleValueForUnit(HKUnit(fromString: "count/min"))
                    println("sample: \(count) : \(result)")
                }
            }
    }
    healthKitStore.executeQuery(query)
}

编辑2:
它起作用了,但我不能像以前那样称呼它。所以几秒钟后我拿到了它,它工作得很好:)

最佳答案

…但是就像我之前说的,当手机被锁定时,它不会更新…我猜这是安全问题。
你是对的。
HealthKit Framework Reference开始:
由于HealthKit存储区已加密,因此当手机锁定时,您的应用程序无法从存储区读取数据。这意味着您的应用程序在后台启动时可能无法访问商店。然而,即使手机被锁定,应用程序仍然可以向商店写入数据。存储区会临时缓存数据,并在手机解锁后将其保存到加密存储区。
如果您希望在有新结果时提醒您的应用程序,则应查看Managing Background Delivery
enableBackgroundDeliveryForType:frequency:withCompletion:
调用此方法注册应用程序以进行后台更新。每当指定类型的新样本保存到应用商店时,HealthKit会唤醒应用程序。您的应用程序在指定频率定义的每个时间段内最多调用一次。

关于swift - HealthKit在间隔之间获取数据,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/30556642/

10-12 00:22