Documentation Index
Fetch the complete documentation index at: https://mintlify.com/kingstinct/react-native-healthkit/llms.txt
Use this file to discover all available pages before exploring further.
React Native HealthKit provides comprehensive support for workout data, including creating workouts, querying workout history, accessing GPS routes, and retrieving workout statistics.
Query workouts
Fetch workout samples with various filters:
import { queryWorkoutSamples, WorkoutActivityType } from '@kingstinct/react-native-healthkit';
// Get recent workouts
const workouts = await queryWorkoutSamples({
limit: 10
});
// Filter by activity type
const runs = await queryWorkoutSamples({
limit: 20,
filter: {
workoutActivityType: WorkoutActivityType.running
}
});
// Filter by date range
const workouts = await queryWorkoutSamples({
limit: 100,
filter: {
date: {
startDate: new Date(2024, 0, 1),
endDate: new Date(2024, 11, 31)
}
}
});
Get most recent workout
Quickly access the latest workout:
import { getMostRecentWorkout } from '@kingstinct/react-native-healthkit';
const lastWorkout = await getMostRecentWorkout();
if (lastWorkout) {
console.log(lastWorkout.workoutActivityType);
console.log(lastWorkout.duration);
console.log(lastWorkout.totalDistance);
console.log(lastWorkout.totalEnergyBurned);
}
Workout activity types
HealthKit supports over 75 workout activity types:
import { WorkoutActivityType } from '@kingstinct/react-native-healthkit';
// Common activity types
WorkoutActivityType.running // 37
WorkoutActivityType.cycling // 13
WorkoutActivityType.swimming // 46
WorkoutActivityType.walking // 52
WorkoutActivityType.yoga // 57
WorkoutActivityType.hiking // 24
WorkoutActivityType.functionalStrengthTraining // 20
WorkoutActivityType.highIntensityIntervalTraining // 63
WorkoutActivityType.other // 3000
Workout sample data
Workout samples contain comprehensive information:
for (const workout of workouts) {
// Basic info
console.log(workout.uuid);
console.log(workout.startDate);
console.log(workout.endDate);
console.log(workout.workoutActivityType);
// Duration
console.log(workout.duration.quantity); // in seconds
console.log(workout.duration.unit); // "s"
// Distance (if available)
if (workout.totalDistance) {
console.log(workout.totalDistance.quantity);
console.log(workout.totalDistance.unit); // "km", "mi", etc.
}
// Energy burned (if available)
if (workout.totalEnergyBurned) {
console.log(workout.totalEnergyBurned.quantity);
console.log(workout.totalEnergyBurned.unit); // "kcal"
}
// Swimming specific (if available)
if (workout.totalSwimmingStrokeCount) {
console.log(workout.totalSwimmingStrokeCount.quantity);
}
// Climbing specific (if available)
if (workout.totalFlightsClimbed) {
console.log(workout.totalFlightsClimbed.quantity);
}
// Metadata
if (workout.metadataIndoorWorkout !== undefined) {
console.log('Indoor:', workout.metadataIndoorWorkout);
}
if (workout.metadataAverageSpeed) {
console.log('Avg speed:', workout.metadataAverageSpeed);
}
if (workout.metadataElevationAscended) {
console.log('Elevation gain:', workout.metadataElevationAscended);
}
}
Workout events
Workouts can contain events like pauses, laps, and segments:
if (workout.events) {
for (const event of workout.events) {
console.log(event.type); // WorkoutEventType.pause, .resume, .lap, etc.
console.log(event.startDate);
console.log(event.endDate);
}
}
Workout routes
Access GPS location data for workouts with routes:
const workouts = await queryWorkoutSamples({ limit: 1 });
const workout = workouts[0];
// Get all routes for this workout
const routes = await workout.getWorkoutRoutes();
for (const route of routes) {
console.log('Route has', route.locations.length, 'locations');
for (const location of route.locations) {
console.log(location.latitude);
console.log(location.longitude);
console.log(location.altitude); // meters
console.log(location.speed); // m/s
console.log(location.course); // degrees
console.log(location.date);
console.log(location.horizontalAccuracy);
console.log(location.verticalAccuracy);
// Distance from start (if available)
if (location.distance) {
console.log(location.distance); // meters
}
}
}
Not all workouts have routes. Only workouts recorded with GPS tracking (like outdoor runs or cycling) will have route data.
Workout statistics
Get detailed statistics for any quantity type associated with a workout:
const workouts = await queryWorkoutSamples({ limit: 1 });
const workout = workouts[0];
// Get heart rate statistics for this workout
const heartRateStats = await workout.getStatistic(
'HKQuantityTypeIdentifierHeartRate',
'count/min'
);
if (heartRateStats) {
console.log('Average HR:', heartRateStats.averageQuantity);
console.log('Min HR:', heartRateStats.minimumQuantity);
console.log('Max HR:', heartRateStats.maximumQuantity);
}
// Get all available statistics
const allStats = await workout.getAllStatistics();
console.log(allStats);
// Returns object with keys like 'HKQuantityTypeIdentifierHeartRate'
Create workouts
Save new workout sessions:
import { saveWorkoutSample, WorkoutActivityType } from '@kingstinct/react-native-healthkit';
const workout = await saveWorkoutSample({
workoutActivityType: WorkoutActivityType.running,
start: new Date(2024, 0, 1, 7, 0),
end: new Date(2024, 0, 1, 8, 0),
energyBurned: {
quantity: 300,
unit: 'kcal'
},
distance: {
quantity: 5,
unit: 'km'
},
metadata: {
HKIndoorWorkout: false,
HKAverageSpeed: 2.5 // m/s
}
});
console.log('Saved workout:', workout.uuid);
Add routes to workouts
Save GPS tracking data for a workout:
const workout = await saveWorkoutSample({
workoutActivityType: WorkoutActivityType.running,
start: new Date(2024, 0, 1, 7, 0),
end: new Date(2024, 0, 1, 8, 0),
metadata: {}
});
// Build location array from GPS tracking
const locations = [
{
latitude: 37.7749,
longitude: -122.4194,
altitude: 10,
course: 0,
speed: 2.5,
horizontalAccuracy: 5,
verticalAccuracy: 5,
date: new Date(2024, 0, 1, 7, 0)
},
{
latitude: 37.7750,
longitude: -122.4195,
altitude: 11,
course: 45,
speed: 2.6,
horizontalAccuracy: 5,
verticalAccuracy: 5,
date: new Date(2024, 0, 1, 7, 1)
},
// ... more locations
];
await workout.saveWorkoutRoute(locations);
Filter by duration
Query workouts by duration:
import { ComparisonPredicateOperator } from '@kingstinct/react-native-healthkit';
// Find workouts longer than 30 minutes
const longWorkouts = await queryWorkoutSamples({
filter: {
duration: {
predicateOperator: ComparisonPredicateOperator.greaterThan,
durationInSeconds: 30 * 60
}
}
});
Using hooks
Monitor workout data reactively:
import { useMostRecentWorkout } from '@kingstinct/react-native-healthkit';
function LastWorkoutDisplay() {
const workout = useMostRecentWorkout();
if (!workout) return <Text>No workouts yet</Text>;
return (
<View>
<Text>Type: {workout.workoutActivityType}</Text>
<Text>Duration: {workout.duration.quantity}s</Text>
{workout.totalDistance && (
<Text>Distance: {workout.totalDistance.quantity} {workout.totalDistance.unit}</Text>
)}
</View>
);
}
Workout plans
Access workout plan information (iOS 17+):
const workouts = await queryWorkoutSamples({ limit: 1 });
const workout = workouts[0];
const plan = await workout.getWorkoutPlan();
if (plan) {
console.log('Plan ID:', plan.id);
console.log('Activity type:', plan.activityType);
}
The WorkoutProxy object returned from queryWorkoutSamples and saveWorkoutSample is not just data - it’s a hybrid object with methods like getWorkoutRoutes(), getStatistic(), and saveWorkoutRoute(). Use these methods to access related workout data.