Skip to main content

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))
}
}
}
}
}