-
Suivez vos entraînements avec HealthKit sur iOS et iPadOS
Découvrez les bonnes pratiques pour créer une expérience d'entraînement optimale pour iOS. Passez en revue le cycle de vie d'une session d'entraînement, explorez les différences entre les entraînements sur Apple Watch et iPhone, et découvrez comment utiliser les activités en temps réel et Siri pour améliorer l'expérience de votre app sur l'écran verrouillé.
Chapitres
- 0:00 - Introduction
- 0:56 - Exécuter une session d’entraînement
- 2:50 - Obtenir les données de session
- 8:35 - Récupérer après un incident
- 9:34 - Bonnes pratiques
Ressources
- Handling Workout Requests with SiriKit
- Running workout sessions
- Building a workout app for iPhone and iPad
- Building a multidevice workout app
- HKWorkoutSession
Vidéos connexes
WWDC25
WWDC24
WWDC23
-
Rechercher dans cette vidéo…
-
-
1:30 - Set up workout session
// Set up workout session // Create workout configuration let configuration = HKWorkoutConfiguration() configuration.activityType = .running configuration.locationType = .outdoor // Create workout session let session = try HKWorkoutSession(healthStore: healthStore, configuration: configuration) session.delegate = self // Get associated workout builder and add data source let builder = session.associatedWorkoutBuilder() builder.delegate = self builder.dataSource = HKLiveWorkoutDataSource(healthStore: healthStore, workoutConfiguration: configuration) -
1:54 - Starting the session
// Prepare and start session session.prepare() // Start and display count down // Start session and builder collection once count down finishes session.startActivity(with: startDate) try await builder.beginCollection(at: startDate) -
2:14 - Handling Metrics
// Handling collected metrics func workoutBuilder(_ workoutBuilder: HKLiveWorkoutBuilder, didCollectDataOf collectedTypes: Set<HKSampleType>) { for type in collectedTypes { guard let quantityType = type as? HKQuantityType else { return } let statistics = workoutBuilder.statistics(for: quantityType) // Update the published values updateForStatistics(statistics) } } -
2:28 - Ending workout
// Stopping the workout session session.stopActivity(with: .now) // Session transitions to stopped then call end func workoutSession(_ workoutSession: HKWorkoutSession, didChangeTo toState: HKWorkoutSessionState, from fromState: HKWorkoutSessionState, date: Date) { guard change.newState == .stopped, let builder else { return } try await builder.endCollection(at: change.date) let finishedWorkout = try await builder.finishWorkout() session.end() } -
7:17 - Set up Siri Intent
// Create an INExtension within your main app // Define an intent handler public class IntentHandler: INExtension { } // Define the intents to support extension IntentHandler: INStartWorkoutIntentHandling extension IntentHandler: INPauseWorkoutIntentHandling extension IntentHandler: INResumeWorkoutIntentHandling extension IntentHandler: INEndWorkoutIntentHandling -
7:32 - Handle the Siri intent
// Handle the intent public func handle(intent: INStartWorkoutIntent) async -> INStartWorkoutIntentResponse { let state = await WorkoutManager.shared.state switch state { case .running, .paused, .prepared, .stopped: return INStartWorkoutIntentResponse(code: .failureOngoingWorkout, userActivity: nil) default: break; } Task { await MainActor.run { // Handle the intents activity type and location WorkoutManager.shared.setWorkoutConfiguration(activityType: .running, location: .outdoor) } } return INStartWorkoutIntentResponse(code: .success, userActivity: nil) } -
7:52 - App Delegate
// Implement an app delegate // Create app delegate class WorkoutsOniOSSampleAppDelegate: NSObject, UIApplicationDelegate { let handler = IntentHandler() func application(_ application: UIApplication, handlerFor intent: INIntent) -> Any? { return handler } } // Add app delegate to app struct WorkoutsOniOSSampleApp: App { @UIApplicationDelegateAdaptor(WorkoutsOniOSSampleAppDelegate.self) var appDelegate } -
9:09 - Set up crash recovery
// App Delegate func application(_ application: UIApplication, configurationForConnecting connectingSceneSession: UISceneSession, options: UIScene.ConnectionOptions) -> UISceneConfiguration { if options.shouldHandleActiveWorkoutRecovery { let store = HKHealthStore() store.recoverActiveWorkoutSession(completion: { (workoutSession, error) in // Handle error Task { await WorkoutManager.shared.recoverWorkout(recoveredSession: workoutSession) } }) } let configuration = UISceneConfiguration(name: "Default Configuration", sessionRole: connectingSceneSession.role) configuration.delegateClass = WorkoutsOniOSSampleAppSceneDelegate.self return configuration } -
9:25 - Recover the workout session
// Recover the workout for the session func recoverWorkout(recoveredSession: HKWorkoutSession) { session = recoveredSession builder = recoveredSession.associatedWorkoutBuilder() session?.delegate = self builder?.delegate = self workoutConfiguration = recoveredSession.workoutConfiguration let dataSource = HKLiveWorkoutDataSource(healthStore: healthStore, workoutConfiguration: workoutConfiguration) builder?.dataSource = dataSource }
-
-
- 0:00 - Introduction
Le framework HealthKit permet aux apps de santé et de fitness d’accéder à une base de données centralisée et chiffrée contenant les données de santé de l’utilisateur. Grâce aux API d’entraînement de la plateforme, vous pouvez créer des apps d’entraînement complètes pour iPhone et iPad, permettant aux utilisateurs de suivre leurs séances, d’accéder à des données de santé et de recevoir des indications sur leur récupération. Apprenez les bases de la gestion des séances d’entraînement, de l’accès aux mesures en temps réel, de la gestion des incidents, ainsi que des conseils et bonnes pratiques pour optimiser les entraînements.
- 0:56 - Exécuter une session d’entraînement
Le même code peut être utilisé sur iPhone, iPad et Apple Watch avec seulement quelques ajustements mineurs. Pour suivre une activité, vous créez une configuration d’entraînement, définissez son type, puis démarrez une session. Le générateur d’entraînement (workout builder) collecte les données de santé tout au long de la séance.
- 2:50 - Obtenir les données de session
Lorsqu’un entraînement est lancé sur l’Apple Watch, les capteurs intégrés de l’appareil offrent une expérience fluide et continue. En revanche, la collecte des données de fréquence cardiaque sur iPhone ou iPad nécessite l’appairage avec un capteur de fréquence cardiaque externe, car ces appareils n’en sont pas équipés. L’iPhone et l’iPad peuvent collecter diverses métriques d’entraînement, mais le système peut générer des échantillons différents de ceux spécifiquement demandés par une app. Vous pouvez modifier les types de données collectées par défaut pendant un entraînement. Une fois l’entraînement enregistré, vous pouvez accéder aux statistiques récapitulatives et afficher l’évolution des métriques sous forme de graphiques. Les entraînements effectués sur iPhone peuvent offrir des données plus détaillées pour certaines métriques, comme c’est le cas pour les entraînements historiques de l’Apple Watch. L’iPhone se verrouille généralement pendant les entraînements. Pour des raisons de confidentialité, les données de santé ne sont généralement pas accessibles lorsque l’appareil est verrouillé. Cependant, le système peut inviter l’utilisateur à autoriser l’accès aux données d’entraînement par les apps, même lorsque l’appareil est verrouillé. Vous pouvez ensuite afficher des activités en temps réel sur l’écran verrouillé, afin de présenter des mesures essentielles sans que l’utilisateur ait besoin de déverrouiller son téléphone. La prise en charge de Siri s’étend à l’écran verrouillé, permettant aux utilisateurs de démarrer, mettre en pause, reprendre ou annuler un entraînement en mode mains libres. Vous pouvez intégrer des intentions Siri dans vos apps pour activer cette fonctionnalité.
- 8:35 - Récupérer après un incident
La récupération après incident sur Apple Watch relance automatiquement les apps et restaure les séances d’entraînement. Sur iPhone et iPad, un nouveau délégué de scène prend en charge la reprise des séances d’entraînement après un incident. Vous pouvez utiliser ce délégué d’app pour vérifier les options de reprise et récupérer la session restaurée depuis le Health store.
- 9:34 - Bonnes pratiques
Pour suivre efficacement les entraînements avec HealthKit, reflétez les séances lancées depuis l’app Apple Watch sur l’iPhone, demandez uniquement les autorisations de données nécessaires et utilisez l’API Workout Builder. En suivant ces recommandations, vous garantissez une mise à jour précise des anneaux d’activité et améliorez l’expérience utilisateur. Pensez également à adopter les nouvelles API, à explorer l’app de démonstration, et à intégrer la prise en charge des entraînements sur iPhone et iPad pour étendre votre portée.