Created
March 16, 2024 16:58
-
-
Save kemiljk/0fca63f87f6cb5a2a0dfcbcf442ab32b to your computer and use it in GitHub Desktop.
Workout Session function
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
func saveWorkoutToHealthKit() async throws { | |
guard HKHealthStore.isHealthDataAvailable() else { | |
print("HealthKit is not available on this device.") | |
return | |
} | |
let healthStore = HealthKitManager.shared.healthStore | |
if HKHealthStore.isHealthDataAvailable() { | |
let energyBurnedType = HKObjectType.quantityType(forIdentifier: .activeEnergyBurned)! | |
let energyBurnedPredicate = HKQuery.predicateForSamples(withStart: setStartDate, end: setEndDate, options: .strictEndDate) | |
let energyBurnedQuery = HKStatisticsQuery(quantityType: energyBurnedType, quantitySamplePredicate: energyBurnedPredicate, options: .cumulativeSum) { _, result, _ in | |
guard let result = result else { | |
print("Error: No result for energy burned query.") | |
return | |
} | |
if let energyBurned = result.sumQuantity()?.doubleValue(for: HKUnit.kilocalorie()) { | |
print("Total Energy Burned: \(energyBurned)") | |
self.energyBurned = energyBurned | |
} else { | |
print("No energy burned data available.") | |
} | |
} | |
healthStore.execute(energyBurnedQuery) | |
let heartRateType = HKObjectType.quantityType(forIdentifier: .heartRate)! | |
let heartRatePredicate = HKQuery.predicateForSamples(withStart: setStartDate, end: setEndDate, options: .strictEndDate) | |
let heartRateQuery = HKStatisticsQuery(quantityType: heartRateType, quantitySamplePredicate: heartRatePredicate, options: .discreteAverage) { _, result, _ in | |
guard let result = result else { | |
print("Error: No result for heart rate query.") | |
return | |
} | |
if let averageHeartRate = result.averageQuantity()?.doubleValue(for: HKUnit(from: "count/min")) { | |
print("Average Heart Rate: \(averageHeartRate)") | |
self.averageHeartRate = averageHeartRate | |
} else { | |
print("No heart rate data available.") | |
} | |
} | |
healthStore.execute(heartRateQuery) | |
} | |
let workoutConfiguration = HKWorkoutConfiguration() | |
workoutConfiguration.activityType = .traditionalStrengthTraining | |
workoutConfiguration.locationType = .indoor | |
let builder = HKWorkoutBuilder(healthStore: healthStore, configuration: workoutConfiguration, device: .local()) | |
try await builder.beginCollection(at: setStartDate) | |
try await builder.addMetadata([ | |
HKMetadataKeyIndoorWorkout: true, | |
HKMetadataKeyExternalUUID: UUID().uuidString, | |
HKMetadataKeySyncIdentifier: UUID().uuidString, | |
HKMetadataKeySyncVersion: 1, | |
HKMetadataKeyWasUserEntered: true | |
]) | |
let durationInSeconds = setEndDate.timeIntervalSince1970 - setStartDate.timeIntervalSince1970 | |
print("Duration of workout session: \(durationInSeconds) seconds") | |
try await builder.endCollection(at: setEndDate) | |
let workout = try await builder.finishWorkout() | |
let energyBurnedType = HKObjectType.quantityType(forIdentifier: .activeEnergyBurned)! | |
let unit = HKUnit.kilocalorie() | |
let energyQuantity = HKQuantity(unit: unit, doubleValue: energyBurned) | |
let energySample = HKCumulativeQuantitySample(type: energyBurnedType, quantity: energyQuantity, start: setStartDate, end: setEndDate) | |
do { | |
try await healthStore.save(energySample) | |
print("\(energyBurned) added to HealthKit successfully.") | |
} catch { | |
print("Failed to save energy burned data: \(error.localizedDescription)") | |
} | |
let heartRateType = HKObjectType.quantityType(forIdentifier: .heartRate)! | |
let heartRateQuantity = HKQuantity(unit: HKUnit(from: "count/min"), doubleValue: averageHeartRate) | |
let heartRateSample = HKQuantitySample(type: heartRateType, quantity: heartRateQuantity, start: setStartDate, end: setEndDate) | |
do { | |
try await healthStore.save(heartRateSample) | |
print("Heart Rate added to HealthKit successfully.") | |
} catch { | |
print("Failed to save energy burned data: \(error.localizedDescription)") | |
} | |
try await healthStore.save(workout!) | |
print("Workout saved successfully to HealthKit.") | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment