apple_workout_scheduler
A Flutter plugin to schedule and push custom workouts to Apple Watch using HealthKit. Create structured interval workouts with distance or time-based goals, perfect for running, cycling, and other cardio activities.
Features
- 🏃 Schedule custom workout sessions on Apple Watch
- ⏱️ Support for time-based and distance-based workout goals
- 🔄 Create interval workouts with work and recovery periods
- 🔒 Request and check HealthKit authorization status
- 📅 Schedule workouts for specific dates and times
- 📱 Seamless integration with Apple Health ecosystem
Platform Support
| iOS | macOS | Android | Web | Windows | Linux |
|---|---|---|---|---|---|
| ✅ | ❌ | ❌ | ❌ | ❌ | ❌ |
Requirements
- iOS 14.0+
- HealthKit capabilities enabled
- Apple Watch paired with iPhone
Installation
Add apple_workout_scheduler to your pubspec.yaml:
dependencies:
apple_workout_scheduler: ^0.0.1
Then run:
flutter pub get
Setup
iOS Configuration
-
Enable HealthKit Capability
In Xcode, open your project and navigate to:
- Select your target → Signing & Capabilities
- Click "+ Capability" and add "HealthKit"
-
Update Info.plist
Add the following keys to your
ios/Runner/Info.plist:<key>NSHealthShareUsageDescription</key> <string>This app needs access to read your health data to schedule workouts</string> <key>NSHealthUpdateUsageDescription</key> <string>This app needs access to write workout data to your health profile</string>
Usage
Basic Example
import 'package:apple_workout_scheduler/apple_workout_scheduler.dart';
import 'package:apple_workout_scheduler/entities/workout_model.dart';
import 'package:apple_workout_scheduler/entities/auth_response_enum.dart';
final _appleWorkoutScheduler = AppleWorkoutScheduler();
// Request HealthKit authorization
Future<void> requestAuthorization() async {
WorkoutAuthentication status =
await _appleWorkoutScheduler.requestAuthorization();
if (status == WorkoutAuthentication.authorized) {
print('Authorization granted!');
}
}
// Check current authorization status
Future<void> checkAuthorization() async {
WorkoutAuthentication status =
await _appleWorkoutScheduler.getAuthorization();
print('Current status: ${status.name}');
}
// Schedule a simple workout
Future<void> scheduleWorkout() async {
ExceriseModel workout = ExceriseModel(
title: 'Morning Run',
date: DateTime.now(),
sessions: [
SessionModel(
reps: 1,
workouts: [
Workout(
sessionType: SessionType.work,
goalType: SessionGoalType.distance,
goal: 5000, // 5000 meters
),
],
),
],
);
await _appleWorkoutScheduler.scheduleWorkout(workout);
}
Advanced Example: Interval Training
Create a complex interval workout with multiple work/recovery cycles:
Future<void> scheduleIntervalWorkout() async {
ExceriseModel intervalWorkout = ExceriseModel(
title: 'Interval Training',
date: DateTime.now().add(Duration(hours: 1)), // Schedule for later
sessions: [
// Warm-up
SessionModel(
reps: 1,
workouts: [
Workout(
sessionType: SessionType.work,
goalType: SessionGoalType.time,
goal: 300, // 5 minutes in seconds
),
],
),
// Main interval set (5x)
SessionModel(
reps: 5,
workouts: [
Workout(
sessionType: SessionType.work,
goalType: SessionGoalType.distance,
goal: 1000, // 1000 meters
),
Workout(
sessionType: SessionType.recovery,
goalType: SessionGoalType.time,
goal: 120, // 2 minutes recovery
),
],
),
// Cool-down
SessionModel(
reps: 1,
workouts: [
Workout(
sessionType: SessionType.recovery,
goalType: SessionGoalType.time,
goal: 300, // 5 minutes
),
],
),
],
);
await _appleWorkoutScheduler.scheduleWorkout(intervalWorkout);
}
API Reference
AppleWorkoutScheduler
Methods
requestAuthorization()
Request HealthKit authorization from the user.
Future<WorkoutAuthentication> requestAuthorization()
Returns: WorkoutAuthentication enum value
getAuthorization()
Get the current HealthKit authorization status.
Future<WorkoutAuthentication> getAuthorization()
Returns: WorkoutAuthentication enum value
scheduleWorkout(ExceriseModel model)
Schedule a workout on Apple Watch.
Future<dynamic> scheduleWorkout(ExceriseModel model)
Parameters:
model: AnExceriseModelcontaining workout configuration
Returns: Boolean or dynamic value indicating success
Data Models
ExceriseModel
Represents a complete workout.
ExceriseModel({
required String title, // Workout title
required List<SessionModel> sessions, // List of workout sessions
required DateTime date, // Scheduled date and time
})
SessionModel
Represents a workout session with repetitions.
SessionModel({
required int reps, // Number of repetitions
required List<Workout> workouts, // List of workout segments
})
Workout
Represents an individual workout segment.
Workout({
required SessionGoalType goalType, // distance or time
required SessionType sessionType, // work or recovery
required int goal, // Goal value
})
Goal units:
- Distance: meters (e.g., 5000 = 5km)
- Time: seconds (e.g., 300 = 5 minutes)
Enums
WorkoutAuthentication
enum WorkoutAuthentication {
notDetermined, // User hasn't been asked for authorization yet
restricted, // Authorization restricted (parental controls, etc.)
denied, // User denied authorization
authorized, // Authorization granted
}
SessionType
enum SessionType {
work, // Active workout segment
recovery, // Recovery/rest segment
}
SessionGoalType
enum SessionGoalType {
distance, // Goal measured in meters
time, // Goal measured in seconds
}
Example App
Check out the example app for a complete working implementation.
Troubleshooting
Authorization Issues
If authorization is not working:
- Ensure HealthKit capability is enabled in Xcode
- Check that Info.plist contains the required usage descriptions
- Verify device has an Apple Watch paired
- Reset Health app permissions in Settings → Privacy & Security → Health
Workout Not Appearing
If scheduled workouts don't appear on Apple Watch:
- Ensure the Apple Watch is connected and unlocked
- Check that HealthKit sync is enabled
- Verify the scheduled date is in the future
- Restart both iPhone and Apple Watch
Limitations
- iOS only (requires HealthKit)
- Requires paired Apple Watch
- Limited to HealthKit-supported workout types
- Workouts must have valid date in the future or present
Contributing
Contributions are welcome! Please read our contributing guide and submit pull requests to our repository.
Issues and Feedback
Please file issues, bugs, or feature requests in our issue tracker.
License
This project is licensed under the MIT License - see the LICENSE file for details.
Author
Created and maintained by the Fitpage team.
Changelog
See CHANGELOG.md for a detailed list of changes.