본문 바로가기
iOS_Swift 앱개발👍

[iOS_Swift] HealthKit - 헬스킷 : 건강 데이터 사용해보자! _ 36

by 개발하는윤기사 2023. 8. 16.
728x90
반응형

 

안녕하세요!! 

 

이번 글에서는 애플 헬스킷(HealthKit)에 대한 설명을 해드리고자 합니다! 

 

현재 진행하고 있는 프로젝트에서, 사용자의 건강 데이터를 이용해 걸음수, 심박수, 칼로리 등 데이터를 건강 앱에 저장(Write)을 시키고, 저장된 건강 데이터 값을 읽어오고(Read) 있는데요!

 

이 과정에 대해 정리글을 남기고자 작성합니다!!

 

1. 헬스킷 - 건강 데이터를 사용하기 위한 기본 준비과정

2. 헬스킷 - 건강 앱을 이용한 건강 데이터 자세히 다루기

 

두 가지의 글을 작성할 건데요! 이번 편은 건강 데이터를 사용하기 위한 기본 준비과정이라고 생각하시면 됩니다!

 

설명에 들어가기 앞서, 쉽게 설명드리기 위해 2020 WWDC의 HealthKit 내용을 토대로 설명을 드릴 거라, 쉽게 이해하실 수 있을 겁니다!

 

 

시작하기 전에! Xcode 프로젝트 > Signing & Capabilities에 HealthKit이 추가되어 있는지 확인해 주세요!!

 

 


HealthKit의 특징

 

 

  • HealthKit은 아이폰, 애플워치, 아이클라우드를 포함한 여러 장치에서 건강 데이터와 상호 작용할 수 있습니다.
  • 장치에서 모든 건강 데이터를 안전하게 저장하고 동기화하므로 개발자는 처리에 대해 걱정할 필요가 없다.

 

아주 편한데...?

 

 


HealthKit 설정하기

  1. Signing & Capabilities에 HealthKit 추가
  2. 실행 중인 플랫폼이 HealthKit을 지원하는지 여부 확인
  3. HKHealthStore 생성
    • HKHealthStore은 권한을 묻고, 건강 데이터를 저장하고, 쿼리를 통해 데이터를 불러오고, 한 번만 생성하고, 그 이후에는 재사용합니다.
    • 즉 하나의 인스턴스만 생성하고, 앱 생명 주기 동안 재사용하면 됩니다!
import HealthKit

var healthStore: HKHealthStore?

if HKHealthStore.isHealthDataAvailable() {

	// HealthKit 사용 가능!
	// healthStore 인스턴스화
	healthStore = HKHealthStore() 

} else {

	// HealthKit 사용 불가능 ㅠ.ㅠ

}
  • 다양한 유형의 건강 데이터는 건강 샘플(Sample)로 저장이 됩니다. 건강 샘플은 모두 매우 유사한 패턴으로 구성되어 있고, 그것들은 모두 나타내는 관련 데이터 타입, 값, 시간, 추가 정보인 메타데이터를 가지고 있습니다.
  • 이 메타데이터 값을 임의로 넣어줄 수도 있고, 이 메타데이터 값으로 분기처리를 구현할 수도 있습니다!

 

WWDC 2020 - Apple HealthKit에서 설명한 내용을 토대로 추가 설명을 드리자면!

  • HealthKit은 HKSample이라는 클래스의 서브클래스를 이용하여 대부분의 데이터를 저장합니다.
  • 예를 들어, 값과 단위를 포함한 정량화된 데이터를 보여주는 HKQuantitySample은 주어진 단위에 대한 값을 저장하는 객체인 HKQuantity를 하나 이상 포함하고 있는 객체인 것입니다!

 

 

여기까지 헬스킷에 관한 기본적인 내용을 알아봤습니다!!

 

이제 권한 요청 과정부터, 데이터를 어떻게 저장하고, 읽어오는지에 대한 설명을 들어가겠습니다!

 

 

 

 


1. HealthKit 권한 요청하기

  • Info.plist에 두 개의 키를 정의합니다. (상태 업데이트 설명과 상태 공유 사용 설명)

 

  • 특정 데이터 유형별로 사용자의 건강 데이터에 대한 승인을 요청합니다.
  • 사용자가 앱에 액세스 할 수 있는 데이터를 최대한 제어할 수 있도록 읽기 권한과 쓰기 권한이 별도로 처리된다.
  • 따라서 사용자는 요청한 데이터에 대해 승인하거나 거부할 수 있습니다.
  • 사용자가 권한에 대해 거부했을 경우 권한 요청 팝업을 다시 띄우지 않고, 건강 앱에서 직접 권한 요청을 허용해야 합니다!

 

  • 적절한 타이밍에 승인을 요청해야 하고, 건강 데이터를 저장하거나 읽는 등, 사용자의 건강 데이터와 상호 작용할 때마다 승인을 요청해야 한다. 필요한 데이터에 대해서만 승인을 요청해야 합니다.
  • 즉, 필요한 타이밍에 필요한 권한만을 요청해야 합니다!

 

2. HealthKit 데이터 저장하기 - Write

 

크게 세 가지 단계로 이루어집니다!

 

1. 데이터 쓰기에 대한 권한 요청

2. Sample 만들기

3. Sample을 HealthKit에 저장하기

 

 

걸음 거리 데이터 저장에 대한 예시를 하나 들어보겠습니다!

 

 

1. 데이터 유형에 대한 쓰기 / 읽기 액세스 요청

  • HKHealthStore의 requestAuthorization 메서드를 통해 원하는 데이터 타입의 쓰기/읽기 권한을 요청하는 부분입니다.
    • toShare : 쓰기
    • read : 읽기
//쓰기 권한 요청
let distanceType = HKQuantityType.quantityType(forIdentifier: .distanceWalkingRunning)!

healthStore?.requestAuthorization(toShare: [distanceType], read: [distanceType]) { success, error in
    if success {
        
    } else {
        
    }
}

 

2. HKQuantity 객체를 생성 → HKQuantitySample 생성

  • 걸음 거리는 값과 단위를 가지고 있는 QuantityType이기 때문에 HKQuantity 객체를 생성하여 HKQuantitySample의 샘플 타입으로 만들어줍니다.
let startDate = Calendar.current.date(bySettingHour: 14, minute: 35, second: 0, of: Date())!
let endDate = Calendar.current.date(bySettingHour: 15, minute: 0, second: 0, of: Date())!

let distanceQuantity = HKQuantity(unit: HKUnit.meter(), doubleValue: 628.0)

//샘플 생성
let sample = HKQuantitySample(type: distanceType,
                              quantity: distanceQuantity,
                              start: startDate,
                              end: endDate)

 

3. 샘플 저장

  • 위에서 만든 Sample을 HKHealthStore의 save() 메서드를 이용해서 저장을 하면, 헬스킷에 저장이 됩니다!
//샘플 저장
healthStore?.save(sample) { success, error in
    if success {
        
    } else {
        
    }
    
}

 

 

💎 (+ 추가 ) 헬스킷 데이터 타입 종류

  • HealthKit은 HKQuantitySample 뿐만 아니라 다양한 Sample을 제공하고 있습니다.
  • 이 타입들은 해당 타입에 대한 읽기/쓰기 권한을 얻거나 샘플을 생성하여 쓰거나 쿼리를 보내서 읽을 때 사용합니다.

- HKObjectType : 가장 상위 클래스

1. uuid : HealthKit object에 대한 고유 식별자
2. sourceRevision : 해당 HealthKit object를 생성한 app 또는 기기
3. device(optional) : 해당 HealthKit object에 대한 데이터를 생성한 장치
4. metadata(optional) : HealthKit object에 대한 메타데이터

 

- HKSampleType : HealthKit 저장소로 작업할 때 특정 유형의 샘플을 식별하는 슈퍼 클래스
1. StartDate : sample 시작 시간
2. EndDate : sample 끝난 시간
3. limit : 최대 샘플 리턴 수

 

- HKCharacteristicType :시간이 흘러도 변하지 않는 값 - Ex. 혈액형, 생일 등

- HKQuantityType : 숫자 값으로 저장되어 있는 정보에 샘플 식별 - Ex. 걸음수, 심박수, 이동 거리 등

- HKCategoryType : 가능한 값의 작은 집합에서 값을 포함하는 샘플을 식별하는 유형 - Ex. 수면분석, 명상, 양치, 손 씻기 등

- HKWorkoutType : 운동 활동에 관한 저장된 정보 샘플 식별, Ex. walking, running, tennis 등

- HKCorrelationType : 여러 하위 샘플을 그룹화하는 샘플을 식별하는 유형입니다. Ex. 혈압, 영양 등

 

 

 

 

 

3. HealthKit 데이터 불러오기 - Read

  • Query를 통해서 Read가 이루어집니다.
  • Query는 HealthKit으로부터 데이터를 받기 위한 객체를 의미합니다!

 

데이터를 불러오기 위해선 데이터 저장할 때와 마찬가지로 세 가지 단계가 필요합니다!

 

 

1. Query를 구성합니다. (데이터 타입과 Predicate)

2. HKHealthStore에서 Query를 Execute 합니다.

3. 핸들러를 통해 결과값을 전달합니다.

 

 

 

HKSampleQuery를 만드는 예를 하나 보여드리겠습니다!

public func setQuery(type: HKQuantityTypeIdentifier, startDate: Date, endDate: Date, limit: Int, completion: @escaping([HealthKitModel])->())  {
        
    let predicate = HKQuery.predicateForSamples(withStart: startDate, end: endDate, options: .strictStartDate)
    let sortDescriptor = NSSortDescriptor(key: HKSampleSortIdentifierEndDate, ascending: true)
    let quantityType = HKQuantityType.quantityType(forIdentifier: type)!
    let query = HKSampleQuery(sampleType: quantityType, 
                              predicate: predicate, 
                              limit: limit, 
                              sortDescriptors: [sortDescriptor]) { [weak self] (query, result, error) -> Void in

        guard let self else { return }

        // Handler 처리

    }
    healthStore.execute(query)
}

1. predicate : Sample 시작 시간과 마지막 시간을 설정하는 부분입니다.

2. sortDescriptor : 어떤 것을 기준으로 정렬할 지에 대한 설정입니다.

3. quantityType : Query로 만들 데이터 타입을 정의하는 부분입니다.

4. query : HKHealthStore에서 execute 할 Query에 대한 정의를 하는 부분입니다.

 

이런 방식으로, SampleQuery에는 어떠한 데이터 타입인지, 어느 시점의 데이터를 불러올 건지, 개수는 몇 개를 제한으로 둘 건지, 정렬은 어떻게 할 것인지에 대한 설정을 하게 됩니다.

 

query를 execute 하게 되면 query, result, error 세 가지의 정보를 가지고 핸들러를 통한 데이터 전달이 이루어집니다!!

 

 

 

 

다음 포스팅에서는 실제로 코드에서 어떻게 이용되는지에 대한 글로 찾아뵙겠습니다~!!

 

 

 

 

 

# 출처 : 

2020 Apple Worldwide Developers Conference / 2020 Apple WWDC 내용을 토대로 만들었습니다.

 

728x90
반응형