Post

Replies

Boosts

Views

Activity

HealthKit Refresh Rate
The refresh rate for reading the heart rate, water depth, etc. from the Apple Watch seems to be every 5 seconds. Is there any way to configure this to 1 second? I'm trying to read the water depth, temperature, and heart rate on a 1-second interval. I used a workout session class I found online: import Foundation import HealthKit class WorkoutSession: NSObject, HKLiveWorkoutBuilderDelegate, HKWorkoutSessionDelegate, ObservableObject{   @Published var energyBurnedStatistics: HKStatistics?   @Published var heartRateStatistics: HKStatistics?   @Published var oxygenSaturationStatistics: HKStatistics?   @Published var elapsedTimeStatistics: HKStatistics?   @Published var underwaterDepthStatistics: HKStatistics?   @Published var waterTempStatistics: HKStatistics?       @Published var energyBurned: Double?   @Published var bpm: Double?   @Published var oxygenSaturation: Double?   @Published var status = HKWorkoutSessionState.notStarted   @Published var elapsedTime: TimeInterval?   @Published var workoutData: HKWorkout?   @Published var underwaterDepth: Double?   @Published var waterTemp: Double?       @Published var session: HKWorkoutSession?   @Published var builder: HKLiveWorkoutBuilder?       var healthStore = HKHealthStore()       func workoutBuilder(_ workoutBuilder: HKLiveWorkoutBuilder, didCollectDataOf collectedTypes: Set<HKSampleType>){     self.heartRateStatistics = workoutBuilder.statistics(for: .init(.heartRate))     self.energyBurned = workoutBuilder.statistics(for: .init(.activeEnergyBurned))?.sumQuantity()?.doubleValue(for: .kilocalorie())     self.energyBurnedStatistics = workoutBuilder.statistics(for: .init(.activeEnergyBurned))     self.underwaterDepthStatistics = workoutBuilder.statistics(for: .init(.underwaterDepth))     self.underwaterDepth = workoutBuilder.statistics(for: .init(.underwaterDepth))?.sumQuantity()?.doubleValue(for: .meter())     self.waterTempStatistics = workoutBuilder.statistics(for: .init(.waterTemperature))     self.waterTemp = workoutBuilder.statistics(for: .init(.waterTemperature))?.sumQuantity()?.doubleValue(for: .degreeFahrenheit())                 self.elapsedTime = workoutBuilder.elapsedTime           self.bpm = calculateBPM()   }       func workoutBuilderDidCollectEvent(_ workoutBuilder: HKLiveWorkoutBuilder){         }       func workoutSession(_ workoutSession: HKWorkoutSession, didChangeTo toState: HKWorkoutSessionState, from fromState: HKWorkoutSessionState, date: Date){         }       func workoutSession(_ workoutSession: HKWorkoutSession, didFailWithError error: Error){         }       func setUpSession(){     let typesToShare: Set = [HKQuantityType.workoutType()]           let typesToRead: Set = [       HKQuantityType.quantityType(forIdentifier: .heartRate)!,       HKQuantityType.quantityType(forIdentifier: .activeEnergyBurned)!     ]           healthStore.requestAuthorization(toShare: typesToShare, read: typesToRead){success, error in     }   }       func startWorkoutSession(){     let configuration = HKWorkoutConfiguration()     configuration.activityType = .other     configuration.locationType = .outdoor           do {       session = try HKWorkoutSession(healthStore: healthStore, configuration: configuration)       builder = session!.associatedWorkoutBuilder()               builder!.dataSource = HKLiveWorkoutDataSource(healthStore: healthStore, workoutConfiguration: configuration)       session!.delegate = self       builder!.delegate = self       session!.startActivity(with: Date())       builder!.beginCollection(withStart: Date()){ success, error in         if(!success){           print("Unable to start collection")         }         self.status = .running       }     } catch {       print("Unable to start workout session, the error: \(error)")     }   }       func endWorkoutSession(){     guard let session = session else {       print("Session is nil. Unable to end workout.")       return     }           guard let builder = builder else {       print("Builder is nil. Unable to end workout.")       return     }           session.end()           builder.endCollection(withEnd: Date()) { success, error in       if (!success){         print("Unable to end collection.")         return       }               builder.finishWorkout {workout, error in         if workout == nil{           print("Unable to read workout")           return         }                   self.status = .ended         self.workoutData = workout       }     }   }       func resumeWorkoutSession(){     guard let session = session else {       print("Session is nil. Unable to end workout.")       return     }           session.resume()     self.status = .running   }       func pauseWorkoutSession(){     guard let session = session else {       print("Session is nil. Unable to end workout.")       return     }           session.pause()     self.status = .paused   } } extension WorkoutSession {   private func calculateBPM() -> Double?{     let countUnit: HKUnit = .count()     let minuteUnit: HKUnit = .minute()     let beatsPerMinute: HKUnit = countUnit.unitDivided(by: minuteUnit)     return self.heartRateStatistics?.mostRecentQuantity()?.doubleValue(for: beatsPerMinute)   } }
0
0
622
Feb ’23