2016-05-31 6 views
0

セッション中に実行されたユーザーの手順を追跡しようとしています。これらのセッションは、30秒から30分の間のどこでもかまいません。私はセッションを開始して歩き始め、1分後にセッションを中止します。これは常に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()を。次に、これら2つの変数を作成して上記の関数を呼び出します。残念ながら、 'stepCount'は常に0を返しています。私はここで間違っていますか?

答えて

1

自分のiPhoneやApple Watchで記録されたユーザーの歩数だけをカウントすることに興味がある場合は、常に最新のレコードがあるのでCMPedometer APIを使用することをおすすめします。 HealthKitを使用する場合は、updateHandlerプロパティ(HKObserverQueryHKStatisticsCollectionQuery、またはHKAnchoredObjectQuery)を持つクエリタイプのいずれかを実行して、アプリケーションがステップを「監視」することにHealthKitを指定する必要があります。セッションの開始時にこれらのクエリの1つを更新ハンドラで実行し、HealthKitにステップ数を頻繁にインポートさせるようにします。

HKObserverQueryは、HealthKitに新しいステップ数があるときに通知するだけなので、セッションの最後に合計を再クエリする必要があります。一方、HKStatisticsCollectionQueryHKAnchoredObjectQueryは、セッションが実行されている間にパフォーマンスを向上させることができる結果をアプリにストリーミングすることができます。

最後に、合計ステップ数を計算するために、HKQuantitySamplesの値を単純に合計することに注意してください。複数のソースからのHealthKitデータは、時間的に重複する可能性があります。たとえば、Apple Watchユーザーは、HealthKitの腕時計を着用していても、携帯電話を携行していた場合でも、HealthKitで複数の手順を実行することができます。このため、合計を計算するには、HKStatisticsQueryまたはHKStatisticsCollectionQueryを使用する方が、重複するサンプルを重複してカウントすることがないので、より良い方法です。

関連する問題