2015-05-31 97 views
2

我對抓HealthKit有點問題。我想在特定的時間從HealthKit獲取心率。 我在過去做到了這一點(直到我注意到,當手機被鎖定我無法獲取數據)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") 
}    

}

但這並沒有工作,因爲我發現有一個錯誤,蘋果公司表示,它不工作,因爲他們想要的。猜猜這是一些安全事物。

但後來我想,也許我可以在startTime和endTime之間請求樣本。例如我有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

這是工作,但我不能把它我做的方式。所以我拿了它幾秒鐘後,它工作正常:)

+0

您是否將此代碼放入您的AppDelegate?我試圖讓觀察員工作,但不管我輸入什麼類型,它永遠不會讓我知道某些東西被添加或刪除:(。 –

回答

3

...但正如我前面所說,它不會更新時,手機被鎖定...猜猜它是一些安全 - 事情。

你是對的。

HealthKit Framework Reference

因爲HealthKit店進行加密,您的應用程序不能從商店當手機被鎖定讀取數據。這意味着您的應用在後臺啓動時可能無法訪問商店。但是,應用程序仍然可以將數據寫入商店,即使手機已鎖定。一旦手機解鎖,商店就暫時緩存數據並將其保存到加密存儲區。

如果您希望當有新的結果,以提醒您的應用程序,你應該檢查Managing Background Delivery

enableBackgroundDeliveryForType:frequency:withCompletion:

調用此方法來註冊你的應用程序的後臺更新。只要指定類型的新樣本保存到商店,HealthKit就會喚醒您的應用程序。您的應用每個由指定頻率定義的時間段最多被調用一次。