Apple의 HealthKit API 소개

iOS HealthKit API는 개발자가 피트니스 및 웰빙 응용 프로그램을 구축하는 데 필요한 코너스톤이되었습니다. iOS 8을 통해 Apple에 도입된 이 프레임 워크는 건강 및 활동 정보에 대한 통합적이고 안전한 저장소를 제공합니다. HealthKit를 통합함으로써 앱은 건강 앱 데이터 저장소에 읽고 쓰기를 통해 사용자가 단계, 심박수, 수면 분석, 식이 기록, 임상 기록, 잠재적 인 통계 및 모범 사례를 볼 수 있습니다. 이 도구는 API 및 모범 사례를 통해 분석 및 분석, 분석 및 분석, 분석 및 분석, 분석 및 분석, 분석, 분석 및 분석, 분석, 분석 및 분석, 분석 및 분석에 대한 통합적인 관점을 볼 수 있습니다.

HealthKit의 건축

HealthKit은 두 가지 주요 개념의 데이터를 구성합니다. data type]과 ]data object]. Data type은 ] 또는 ]과 같은 측정의 범주를 정의합니다. Data object는 samples] (]] 또는 ]를 통해 암호화된 데이터 객체를 식별할 수 있습니다.

핵심 부품

  • HKHealthStore – 모든 HealthKit 작업에 대한 중앙 항목 포인트.
  • HKObjectType – 건강 데이터의 유형(양성, 범주, 또는 특성)을 식별합니다.
  • HKSampleQuery – 저장된 샘플의 고정 세트를 검색합니다.
  • HKStatisticsQuery] – 시간 간격에 걸쳐 계산된 값(sum, 평균, 최소, 최대 등).
  • HKObserverQuery – 지정된 데이터 유형에 대한 변경을 위한 모니터, 배경 업데이트를 가능하게 합니다.

Permissions 설정 – 접근 요청

데이터 교환 전에 앱은 ]을 사용하여 허가를 요청해야합니다. ]과 ]] 키로 ]에서 ]에서 읽고 쓰기 권한을 선언해야합니다. 피트니스 추적을 위해 일반적으로 단계 수, 활성 에너지, 심장 박동 및 잠재적으로 운동을 작성합니다.

import HealthKit

let healthStore = HKHealthStore()

func requestHealthPermissions() {
 guard HKHealthStore.isHealthDataAvailable() else { return }
 let readTypes: Set<HKObjectType> = [
 HKObjectType.quantityType(forIdentifier: .stepCount)!,
 HKObjectType.quantityType(forIdentifier: .heartRate)!,
 HKObjectType.quantityType(forIdentifier: .activeEnergyBurned)!,
 HKObjectType.categoryType(forIdentifier: .sleepAnalysis)!
 ]
 let writeTypes: Set<HKSampleType> = [
 HKObjectType.workoutType()
 ]
 healthStore.requestAuthorization(toShare: writeTypes, read: readTypes) { success, error in
 // Handle response
 }
}

항상 권한 콜백을 완전히 처리합니다. 사용자의 쇠퇴가 발생하면 기능 차단을 피하십시오. 대신 데이터가 필요한 이유와 대안 (예 : 수동 입력)을 제공합니다. 권한이 건강 앱의 소스 탭에서 나중에 변경 될 수 있다는 것을 기억하십시오.

Querying 피트니스 데이터

HealthKit은 여러 쿼리 유형의 데이터를 효율적으로 fetch합니다. 피트니스 앱의 가장 일반적인 샘플 쿼리 및 통계 쿼리입니다.

HKSampleQuery – 데이터의 검색

]를 사용하면, 마지막 100개의 심박수 판독 또는 오늘 단계 로그와 같은 개별 레코드가 필요할 때 사용합니다. 날짜, 소스, 또는 값으로 필터에 우선적으로 지정하십시오. 성능에 대해서는, 항상 결과의 수를 제한합니다.

let stepType = HKQuantityType.quantityType(forIdentifier: .stepCount)!
let startDate = Calendar.current.startOfDay(for: Date())
let predicate = HKQuery.predicateForSamples(withStart: startDate, end: Date(), options: .strictStartDate)

let query = HKSampleQuery(sampleType: stepType, predicate: predicate, limit: HKObjectQueryNoLimit, sortDescriptors: nil) { query, samples, error in
 guard let samples = samples as? [HKQuantitySample] else { return }
 // Process samples
}
healthStore.execute(query)

HKStatisticsQuery – 수집된 데이터

특정 기간 (예를들면, 일일 단계 수) 이상 총, 평균 또는 최대의 경우, ]를 사용하십시오. 이것은 개별 샘플을 요약하는 것보다 훨씬 효율적입니다.

let statisticsQuery = HKStatisticsQuery(quantityType: stepType, quantitySamplePredicate: predicate, options: .cumulativeSum) { query, result, error in
 let sum = result?.sumQuantity()?.doubleValue(for: HKUnit.count()) ?? 0
 // Update UI with total steps
}
healthStore.execute(statisticsQuery)

HKStatisticsCollectionQuery – 시간 시리즈 데이터

지난 주 동안 일 당 단계의 차트를 표시하려면 ]를 사용하십시오. 그것은 시작과 끝 날짜 사이에 매일 통계를 배치하고 트렌드에 이상적입니다.

let now = Date()
let sevenDaysAgo = Calendar.current.date(byAdding: .day, value: -7, to: now)!
let anchorDate = Calendar.current.startOfDay(for: now)
let daily = DateComponents(day: 1)

let collectionQuery = HKStatisticsCollectionQuery(quantityType: stepType, quantitySamplePredicate: nil, options: .cumulativeSum, anchorDate: anchorDate, intervalComponents: daily)
collectionQuery.initialResultsHandler = { query, results, error in
 results?.enumerateStatistics(from: sevenDaysAgo, to: now) { statistics, stop in
 let steps = statistics.sumQuantity()?.doubleValue(for: HKUnit.count()) ?? 0
 // Append steps for statistics.startDate
 }
}
healthStore.execute(collectionQuery)

Fitness Data를 표시

원시 번호는 명확한 시각화 없이 의미가 없습니다. 잘 설계된 UI는 HealthKit 데이터를 동기적인 통찰력으로 변환합니다. 다음 접근법을 고려하십시오:

  • Summary Cards: 오늘 단계 카운트, 활성 분, 컴팩트한 대시보드의 심박수 추세를 보여줍니다.
  • Charts: 매주 단계, 월간 활성 에너지, 또는 심박수 영역을 표시하는 라인 또는 바 차트를 사용합니다. Swift Charts(iOS 16+) 또는 Charts] (DGCharts)는 원활하게 통합됩니다.
  • Goal Rings: Apple의 고전적인 활동 반지는 에너지, 운동 및 대기 시간을 시각화하도록 에뮬레이션 될 수 있습니다.
  • Workout Summaries: 현재 지속가능성, 평균 심박수, 거리, 열량은 각 기록된 운동을 위해 점화했습니다.

예: 단계 카운트 대시보드 구축

SwiftUI의 위 통계 쿼리를 결합하여 라이브 업 단계 카운터를 만듭니다.

struct StepCardView: View {
 @State private var steps: Double = 0

 var body: some View {
 VStack {
 Text("Steps")
 .font(.headline)
 Text("\(Int(steps))")
 .font(.largeTitle)
 .bold()
 }
 .onAppear { fetchTodaySteps() }
 }

 func fetchTodaySteps() {
 // Use HKStatisticsQuery as shown earlier
 }
}

HKObserverQuery와 실시간 업데이트

수동으로 새로 고침없이 대시보드 전류를 유지하려면 ]를 설정합니다. 새로운 데이터가 HealthKit에 저장될 때 시스템이 앱을 삭제합니다 (앱이 배경으로되어 있다면 배경 배송).

let observerQuery = HKObserverQuery(sampleType: stepType, predicate: nil) { query, completionHandler, error in
 DispatchQueue.main.async { self.fetchTodaySteps() }
 completionHandler()
}
healthStore.execute(observerQuery)

배경 업데이트에 대해서는 ]을 호출해야합니다. iOS throttles 배경 콜백이 배터리를 보존하는 것을주의하십시오. 이 스패링을 사용하여 항상 완료 핸들러를 처리하십시오.

개인정보 및 보안에 대한 모범 사례

건강 데이터는 민감합니다. Apple은 엄격한 규칙을 시행하고, App Store 거부로 실패할 수 있습니다.

  • Minimal data request:만 데이터 유형만 사용해서 사용하세요. “건강 기록”을 요청하지 않으시면 단계 수를 필요로 합니다.
  • Clear description strings: Info.plist의 사용설명은 특정해야 합니다., "이 앱은 일상적인 활동을 보여주는 단계 카운트를 읽습니다."
  • Never share raw HealthKit data off-device] 명시되지 않는 사용자 동의 없이. 백엔드에 동기화하는 경우 익명화 및 암호화 데이터.
  • 저장 권한 변경: ]를 통해 사용자의 권한 변경 또는 각 쿼리의 승인 상태를 확인하여 관찰.
  • Handle errors gracefully: HealthKit 쿼리는 권한, 데이터 부족, 또는 데이터베이스 오류로 인해 실패할 수 있습니다. 항상 사용자 친화적 인 메시지를 보여줍니다.

Apple Watch 및 기타 소스와 통합

HealthKit는 Apple Watch, 타사 앱 및 수동 항목에서 데이터를 자동으로 집계합니다. iOS 앱은 소스에 의해 필터링 할 때 소스를 구별 할 필요가 없습니다. 운동 앱을 위해 ] Objects를 HealthKit로 작성하십시오. 사용자가 Apple Watch에서 운동을 시작할 때 시스템은 자동으로 지표를 기록 할 수 있습니다. 동료 iOS 앱은 나중에 읽을 수 있습니다.

workout 데이터를 쓰기:

let workout = HKWorkout(activityType: .running, start: workoutStart, end: workoutEnd, duration: duration, totalEnergyBurned: energy, totalDistance: distance, metadata: nil)
healthStore.save(workout) { success, error in
 // Handle
}

또한 ]과 ]를 사용하여 운동에 관련된 샘플 (예 : 심박수, 경로)을 추가 할 수 있습니다.

일반적인 Pitfalls 및 Them을 방지하는 방법

  • 데이터를 항상 사용할 수 있습니다: 새로운 사용자는 HealthKit 데이터가 없습니다. 위주를 표시하거나 사용자가 Health 앱 또는 Apple Watch를 통해 추적을 시작할 수 있도록 UI를 설계하십시오.
  • ] 한 번에 너무 많은 데이터를 쿼리: 대형 쿼리 (예 : 지난해 모든 샘플) 메모리에 느리고 충돌 할 수 있습니다. 날짜를 사용 하 여 제한으로 포장.
  • 시간 영역: HealthKit 타임스탬프는 UTC에 있습니다. 하루 그룹화할 때, 사용자의 현지 시간대로 변환하여 정렬을 피할 수 있습니다.
  • 본문을 잠금: HealthKit 쿼리는 비동기이지만 완성 핸들러는 메인 스레드에서 실행할 수 없습니다. 에 UI 업데이트를 해제합니다.
  • 건강 데이터 가용성 확인: HealthKit는 iPad 및 iPod touch에서 사용할 수 없습니다. 항상 ] 어떤 상호 작용의 앞에 전화하십시오.

건강 기록 및 임상 데이터 확장

HealthKit는 임상 건강에 중점을 둔 앱을 위해 Health Records] (FHIR를 통해)도 지원합니다. 사용자 허가를 통해 앱은 면역, 실험실 결과, 약물 및 조건을 액세스할 수 있습니다. 이 약물 추적기, 알레르기 검사기 또는 만성 상태 관리를위한 가능성을 엽니다. 그러나 이러한 데이터 유형은 Apple의 건강 기록에 대한 추가 리뷰를 요구합니다.

관련 기사

iOS HealthKit API는 강력한 개인 정보 보호 기반을 제공하여 피트니스 데이터를 추적하고 표시하는 데 중점을 둡니다. 권한 모델, 쿼리 유형 및 모범 사례를 이해함으로써 사용자의 건강 생태계와 원활하게 통합되는 응용 프로그램을 구축 할 수 있습니다. 간단한 단계와 심박수 쿼리로 시작하면 점차 배경 업데이트, 시계 연결 및 임상 기록과 같은 고급 기능을 통합합니다. 결과는 건강에 대한 사용자뿐만 아니라 자신의 건강을 알리는 강력한 도구이지만, 그 목표를 달성하기 위해 동기를 부여합니다.

더 읽기를 위해, 공식 ]Apple HealthKit Documentation], ]HealthKit Human Interface Guidelines, 그리고 ]Ray Wenderlich의 HealthKit Tutorial]를 참조하여 핸즈에 코드 예제를 위해.