2016-05-31 60 views
0

我試圖跟蹤會話期間所採取的用戶步驟。這些會話可以從30秒到30分鐘。我開始會議並開始走動,然後一分鐘後我停止了會議。這總是返回0個步驟。這是我正在運行的代碼。iOS HealthKit跟蹤會話期間的用戶步驟

func readUserSteps(startDate:NSDate, endDate:NSDate) { 

    let weightSampleType = HKSampleType.quantityTypeForIdentifier(HKQuantityTypeIdentifierStepCount) 
    let predicate = HKQuery.predicateForSamplesWithStartDate(startDate, endDate: endDate, options: .None) 

    let query = HKSampleQuery(sampleType: weightSampleType!, predicate: predicate, limit: 0, sortDescriptors: nil, resultsHandler: { 
     (query, results, error) in 
     if results == nil { 
      print("There was an error running the query: \(error)") 
     } else { 
      var stepCount:Double = 0 
      for steps in results as! [HKQuantitySample] 
      { 
       stepCount += steps.quantity.doubleValueForUnit(HKUnit.countUnit()) 
      } 
      print("Steps Taken: \(stepCount)") 
     } 
    }) 

    self.healthKitStore.executeQuery(query) 
} 

我當前日期保存爲這樣:let startTime = NSDate()表示會話的開始,一旦用戶停止會議上,我在會議結束時,保存爲這樣:let endTime = NSDate()。然後用這兩個變量創建上面的函數。不幸的是,'stepCount'總是返回0 ..我在這裏做錯了什麼?

回答

1

如果你只是想計算用戶的步驟,如他們的iPhone或Apple Watch記錄的那樣,我建議使用CMPedometer API,因爲它將始終具有最新的記錄。不過,如果您仍想使用HealthKit,則需要向HealthKit指明您的應用程序有興趣通過執行任何具有updateHandler屬性(HKObserverQueryHKStatisticsCollectionQueryHKAnchoredObjectQuery)的查詢類型來「觀察」步驟。使用更新處理程序在會話開始時執行其中一個查詢,以便HealthKit更頻繁地導入步數。

HKObserverQuery只會在HealthKit中有新的步驟計數時通知您,因此在會話結束時您需要重新查詢總計。另一方面,HKStatisticsCollectionQueryHKAnchoredObjectQuery可以在會話運行時將結果流式傳輸到您的應用程序,這對性能可能會更好。

最後,要小心簡單地總結HKQuantitySamples的值來計算總步數。來自多個來源的HealthKit數據可能會在時間上重疊。例如,Apple Watch用戶可能在HealthKit中有多個步驟來源,當天他們都戴着手錶並攜帶手機。出於這個原因,最好使用HKStatisticsQueryHKStatisticsCollectionQuery來計算總和,因爲它避免了對重疊樣本進行重複計數。