From 8e8810493e75d5b1b6b0d088c46680697a82bbb1 Mon Sep 17 00:00:00 2001 From: oliverhnat Date: Sat, 6 Jan 2024 14:01:12 +0100 Subject: [PATCH] Get total sleep time for the last 7 days --- SleepDebt/ContentView.swift | 17 +++++++++++++++- SleepDebt/HealthKitManager.swift | 34 ++++++++++++++++++++++++++++++++ 2 files changed, 50 insertions(+), 1 deletion(-) diff --git a/SleepDebt/ContentView.swift b/SleepDebt/ContentView.swift index dbc98ba..102f0fc 100644 --- a/SleepDebt/ContentView.swift +++ b/SleepDebt/ContentView.swift @@ -14,9 +14,24 @@ struct ContentView: View { Image(systemName: "globe") .imageScale(.large) .foregroundStyle(.tint) - Text("Hello, world!") + Button(action: { + manager.getSleepForLast7Days() + print(manager.sleepForLast7Days) + var seconds = manager.sleepForLast7Days + print("hours: ", seconds / 3600, " minutes: ", (seconds % 3600) / 60, " seconds: ", (seconds % 3600) % 60) + }) { + Text("Hello, world!") + } } .padding() + .onAppear { + manager.getSleepForLast7Days() + print(manager.sleepForLast7Days) + var seconds = manager.sleepForLast7Days + print("hours: ", seconds / 3600, " minutes: ", (seconds % 3600) / 60, " seconds: ", (seconds % 3600) % 60) + + + } } } diff --git a/SleepDebt/HealthKitManager.swift b/SleepDebt/HealthKitManager.swift index 2d14dfa..b015268 100644 --- a/SleepDebt/HealthKitManager.swift +++ b/SleepDebt/HealthKitManager.swift @@ -8,10 +8,18 @@ import Foundation import HealthKit +extension Date { + static var last7Days: Date { + Date().addingTimeInterval(TimeInterval(-60 * 60 * 24 * 7)) // last 7 days + } +} + class HealthKitManager: ObservableObject { let healthStore = HKHealthStore() + var sleepForLast7Days: Int = 0 + init() { let sleep = HKCategoryType(.sleepAnalysis) @@ -24,7 +32,33 @@ class HealthKitManager: ObservableObject { print(error) } } + self.getSleepForLast7Days() } + func getSleepForLast7Days() { + var totalSleep = 0 + let sleep = HKCategoryType(.sleepAnalysis) + let sleepPredicate = HKCategoryValueSleepAnalysis.predicateForSamples(equalTo: HKCategoryValueSleepAnalysis.allAsleepValues) + let datePredicate = HKQuery.predicateForSamples(withStart: .last7Days, end: .now) + let predicates = NSCompoundPredicate(andPredicateWithSubpredicates: [sleepPredicate, datePredicate]) + let sortByDate = NSSortDescriptor(key: HKSampleSortIdentifierEndDate, ascending: false) + let query = HKSampleQuery( + sampleType: sleep, + predicate: predicates, + limit: 100000, + sortDescriptors: [sortByDate]) + {_, results, error in + for(_, sample) in results!.enumerated() { + guard let currData:HKCategorySample = sample as? HKCategorySample else { print("There was an error"); return } + + let endDate = currData.endDate + let startDate = currData.startDate + let seconds = Int(endDate.timeIntervalSince(startDate)) + totalSleep += seconds + } + self.sleepForLast7Days = totalSleep + } + healthStore.execute(query) + } }