Skip to content

Instantly share code, notes, and snippets.

@kemiljk
Created March 16, 2024 16:58
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save kemiljk/0fca63f87f6cb5a2a0dfcbcf442ab32b to your computer and use it in GitHub Desktop.
Save kemiljk/0fca63f87f6cb5a2a0dfcbcf442ab32b to your computer and use it in GitHub Desktop.
Workout Session function
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