2016-05-31 3 views
0

세션 중에 수행 된 사용자 단계를 추적하려고합니다. 이 세션은 30 초에서 30 분까지 가능합니다. 세션을 시작한 다음 1 분 후에 세션을 중지합니다. 이것은 항상 0 단계를 반환합니다. 다음은 실행중인 코드입니다. let startTime = NSDate() 세션의 시작을 표현하기 위해 사용자 일단 내가 그렇게으로 세션의 끝을 저장 세션 중지 : 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 endTime = NSDate()을. 그런 다음이 두 변수를 작성하여 위의 함수를 호출합니다. 불행히도 'stepCount'는 항상 0을 반환합니다. 여기서 내가 뭘 잘못하고 있니?

답변

1

iPhone 또는 Apple Watch에서 기록한대로 사용자의 계단 수를 계산하는 데 관심이있는 경우 가장 최신의 기록이 있으므로 CMPedometer API를 사용하는 것이 좋습니다. 그래도 HealthKit을 사용하고 싶다면 updateHandler 속성 (HKObserverQuery, HKStatisticsCollectionQuery 또는 HKAnchoredObjectQuery)이있는 쿼리 유형을 실행하여 앱이 단계를 "관찰"하는 데 관심이 있다는 것을 HealthKit에 표시해야합니다. 세션 시작시 업데이트 처리기로 이러한 쿼리 중 하나를 실행하여 HealthKit에서 단계 수를 더 자주 가져 오도록하십시오.

HKObserverQuery은 HealthKit에 새로운 단계 카운트가있을 때 알려주므로 세션이 끝날 때 총계를 다시 쿼리해야합니다. 반면에 HKStatisticsCollectionQueryHKAnchoredObjectQuery은 세션이 실행되는 동안 성능을 향상시킬 수있는 결과를 앱에 스트리밍 할 수 있습니다.

마지막으로 HKQuantitySamples의 값을 합계하여 총 스텝 수를 계산하는 것에주의하십시오. 여러 소스의 HealthKit 데이터는 시간이 겹칠 수 있습니다. 예를 들어, Apple Watch 사용자는 시계를 착용하고 휴대 할 때 HealthKit에서 여러 단계의 단계를 가질 수 있습니다. 이러한 이유로 겹친 샘플 중복을 피하기 때문에 HKStatisticsQuery 또는 HKStatisticsCollectionQuery을 사용하여 합계를 계산하는 것이 좋습니다.

관련 문제