HealthKit을 사용해서 나의 걸음 수를 알아보자 !

HealthKit을 사용해서 1시간 단위로 저의 평균 걸음 수를 알아볼꺼에요 !

먼저 HealthKit을 사용하기 위해 import를 해주고 property를 하나 생성할께요 !

1
2
import HealthKit
private let healthStore = HKHealthStore()

그리고 개인 건강 정보이기 때문에 권한을 확인 받아야겠죠 ??
info.plist에 두가지만 추가 해줄께요 !

1
2
3
4
5
Privacy - Health Share Usage Description 
: 앱이 HealthKit 스토어에서 샘플을 읽을 수있는 권한을 요청한 이유를 설명하는 메시지입니다.

Privacy - Health Update Usage Description
: 앱이 샘플을 HealthKit 저장소에 저장하기 위해 권한을 요청한 이유를 설명하는 메시지.
  • 권한 설정 화면 !

그리고 하나 더 !
HealthKit이 사용가능한 디바이스인지 데이터를 읽고, 쓰기를 할수 있는지 확인 해볼께요 !
healthStore에서 .stepCount에 대한 request가 success하게 온다면 이제 본격적으로 원하는 data를 가지고 올꺼에요 !

1
2
3
4
5
6
7
8
9
10
11
print(HKHealthStore.isHealthDataAvailable()) // 디바이스 확인

let read = Set([HKObjectType.quantityType(forIdentifier: .stepCount)!])
let write = Set([HKObjectType.quantityType(forIdentifier: .stepCount)!])

healthStore.requestAuthorization(toShare: write, read: read) { (success, error) in
guard error == nil else { return }
if success == true {
self.getTotalStepCount()
}
}

healthStore에 query를 보내서 데이터를 받아오는데요 !
위 코드 주석에 설명 해놓았듯 제가 원하는 data를 가지고 올수 있게 Property를 생성했습니다 !
생성이 완료 했다면 !

1
2
3
4
5
6
7
8
9
10
11
12
func getTotalStepCount() {

// 걸음 수를 가져오기 위한 것
guard let sampleType = HKObjectType.quantityType(forIdentifier: .stepCount) else { return }

// 측정하는 시작날짜와 마지막 날짜
let startDate = Calendar.current.startOfDay(for: Date())
let predicate = HKQuery.predicateForSamples(withStart: startDate, end: Date(), options: .strictStartDate)

// 걸음 수를 볼시 있는 시간 간격
var intervar = DateComponents()
intervar.hour = 1

제가 원하는 data를 얻기위해 query의 파라미터에 생성해두었던 property를 입력합니다 !

1
2
3
4
5
6
let query = HKStatisticsCollectionQuery(
quantityType: sampleType,
quantitySamplePredicate: predicate,
options: .cumulativeSum,
anchorDate: startDate,
intervalComponents: intervar)

query까지 생성이 끝나면 HealthKit에 현재 저장된 샘플 중 일치하는 요청한 샘플에 대한 통계 계산을 완료 한 후 백그라운드 큐에서 핸들러를 실행하여 결과를 출력 할꼐요!

1
2
3
4
5
6
7
8
9
10
11
12
  query.initialResultsHandler = { (sample, result, error) in
if let myResult = result {
myResult.enumerateStatistics(from: startDate, to: Date()) { (statistics, value) in
if let count = statistics.sumQuantity() {
let val = count.doubleValue(for: HKUnit.count())
print (val)
}
}
}
}
healthStore.execute(query)
}

출력 된 data를 사용하여 원하는 View를 설정 해보세요 !

HealthKit_2