Calories
This feature retrieves the heart rate data for the current day. Use an instance of the RookEventsManager class, which includes the getTodayHeartRate function to obtain the current heart rate data burned retrieved from Apple Health.
info
To use this method, ensure a user ID is added and heart rate, resting heart rate, heart rate variability permission is granted.
Example
The bellow code shows how to use this functionality.
import Foundation
import RookSDK
final class EventHrViewModel: ObservableObject {
// MARK: Properties
private let eventSyncManager: RookEventsManager = RookEventsManager()
@Published var date: Date = Date()
@Published var loading: Bool = false
@Published var currentHr: RookHeartRate?
// MARK: Helpers
func syncEvents() {
Task {
do {
self.startLoading()
let success: Bool
success = try await eventSyncManager.syncEvents(date: date, eventType: .heartRate)
debugPrint("success events \(success)")
} catch {
debugPrint("error sync events \(error)")
}
self.cancelLoading()
}
}
func getCurrentHeartRate() {
Task {
do {
self.startLoading()
let hr: RookHeartRate = try await eventSyncManager.getTodayHeartRate()
DispatchQueue.main.async {
self.currentHr = hr
}
} catch {
debugPrint("error current HR \(error)")
}
self.cancelLoading()
}
}
private func startLoading() {
DispatchQueue.main.async {
self.loading = true
}
}
private func cancelLoading() {
DispatchQueue.main.async {
self.loading = false
}
}
}
import SwiftUI
import RookSDK
import Charts
struct EventHrView: View {
@StateObject var viewModel: EventHrViewModel = EventHrViewModel()
var body: some View {
if viewModel.loading {
VStack {
ProgressView()
}
} else {
contentView
}
}
var contentView: some View {
ScrollView {
VStack {
Text("Hr Events")
.font(.system(size: 24, weight: .bold))
.padding(12)
DatePicker("date to fetch",
selection: $viewModel.date,
displayedComponents: .date)
.pickerStyle(.wheel)
.padding(8)
Button(action: {
viewModel.syncEvents()
}, label: {
Text("sync events")
.foregroundColor(.white)
.font(.system(size: 16, weight: .bold))
.frame(width: 250, height: 50)
.background(Color.red)
.cornerRadius(12)
.padding(21)
}).padding(20)
currentHrView
Spacer()
}
.padding(12)
}
}
var currentHrView: some View {
VStack {
Button(action: {
viewModel.getCurrentHeartRate()
}, label: {
Text("get current heart rate")
.foregroundColor(.white)
.font(.system(size: 16, weight: .bold))
.frame(width: 250, height: 50)
.background(Color.red)
.cornerRadius(12)
.padding(21)
}).padding(20)
if let hr: RookHeartRate = viewModel.currentHr {
VStack {
Text("max heart rate \(hr.hrMaximumBPM ?? 0) bpm")
Text("min hear rate \(hr.hrMinimumBPM ?? 0) bpm")
Text("average heart rate \(hr.hrAverageBMP ?? 0) bpm")
Text("resting heart rate \(hr.hrRestingBPM ?? 0) bpm")
Text("hrv sdnn \(hr.hrvAverageSDNN ?? 0)")
if #available(iOS 16.0, *) {
granularHRView
}
}
}
}
}
@available(iOS 16.0, *)
var granularHRView: some View {
VStack {
if let granularHr: [RookHeartRateItem] = viewModel.currentHr?.hrGranularData {
Chart(granularHr, id: \.dateTime) { item in
LineMark(x: .value("Fecha", item.dateTime), y: .value("bpm", item.hrBPM))
}
}
}
}
}