33 lines
1.3 KiB
Swift
33 lines
1.3 KiB
Swift
import HealthKit
|
|
|
|
class HealthKitService: ObservableObject {
|
|
let healthStore = HKHealthStore()
|
|
var isAvailable: Bool { HKHealthStore.isHealthDataAvailable() }
|
|
|
|
func requestAuthorization() async throws {
|
|
let typesToRead: Set<HKObjectType> = [
|
|
HKQuantityType(.heartRate),
|
|
HKQuantityType(.restingHeartRate),
|
|
HKQuantityType(.heartRateVariabilitySDNN),
|
|
HKQuantityType(.stepCount),
|
|
HKQuantityType(.activeEnergyBurned),
|
|
HKQuantityType(.oxygenSaturation),
|
|
HKCategoryType(.sleepAnalysis),
|
|
]
|
|
try await healthStore.requestAuthorization(toShare: [], read: typesToRead)
|
|
}
|
|
|
|
func fetchTodaySteps() async -> Int {
|
|
guard let type = HKQuantityType.quantityType(forIdentifier: .stepCount) else { return 0 }
|
|
let now = Date()
|
|
let startOfDay = Calendar.current.startOfDay(for: now)
|
|
let predicate = HKQuery.predicateForSamples(withStart: startOfDay, end: now)
|
|
return await withCheckedContinuation { cont in
|
|
let q = HKStatisticsQuery(quantityType: type, quantitySamplePredicate: predicate, options: .cumulativeSum) { _, result, _ in
|
|
cont.resume(returning: Int(result?.sumQuantity()?.doubleValue(for: .count()) ?? 0))
|
|
}
|
|
healthStore.execute(q)
|
|
}
|
|
}
|
|
}
|