View in English

  • Global Nav Open Menu Global Nav Close Menu
  • Apple Developer
Search
Cancel
  • Apple Developer
  • News
  • Discover
  • Design
  • Develop
  • Distribute
  • Support
  • Account
Only search within “”

Quick Links

5 Quick Links

Vidéos

Ouvrir le menu Fermer le menu
  • Collections
  • Sujets
  • Toutes les vidéos
  • À propos

Retour à WWDC25

  • À propos
  • Résumé
  • Transcription
  • Code
  • 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

    • Building a multidevice workout app
    • Building a workout app for iPhone and iPad
    • Handling Workout Requests with SiriKit
    • HKWorkoutSession
    • Running workout sessions
      • Vidéo HD
      • Vidéo SD

    Vidéos connexes

    WWDC25

    • Découvrez l’API Medications de HealthKit

    WWDC24

    • Bring your app’s core features to users with App Intents

    WWDC23

    • Build a multi-device workout app
    • Meet ActivityKit
  • Rechercher dans cette vidéo…

    Bonjour, je m’appelle Brian et je suis ingénieur au sein de l’équipe HealthKit. Il existe des centaines d’apps de santé et fitness qui aident les gens à être et à rester en bonne santé. Avec votre autorisation, elles ont accès à la base de données chiffrée centralisée de HealthKit et à un ensemble d’API puissantes pour vous fournir une vue complète de votre santé. Les API d’entraînement sont parmi les plus puissantes fournies par HealthKit. J’ai hâte de vous montrer comment utiliser ces API sur iPhone et iPad. Je vais d’abord aborder les bases de la gestion d’une séance d’entraînement. Je vous expliquerai comment accéder aux indicateurs de santé pendant un entraînement, en mettant l’accent sur les différences par rapport à la procédure sur l’Apple Watch. Je vous montrerai comment récupérer les données en cas de bug et je terminerai par des conseils d’entraînement et bonnes pratiques. Commençons cette séance d’entraînement. Si vous effectuez déjà des entraînements dans une app sur Apple Watch, vous pourrez utiliser le même code sur iPhone et iPad, avec seulement quelques modifications. Comme sur l’Apple Watch, vous pouvez utiliser une séance d’entraînement pour suivre une activité et enregistrer l’entraînement dans HealthKit à l’aide de l’outil de création d’entraînement associé. Comme vous n’avez peut-être pas encore d’app sur votre Apple Watch, je vais vous montrer rapidement comment démarrer une séance d’entraînement. Une séance d’entraînement comporte plusieurs étapes, de la configuration au début à la collecte des données de santé, jusqu’à la fin de la séance. Pour commencer, vous devez créer une configuration d’entraînement et définir son type en fonction de l’activité que la personne effectuera. Je vais utiliser la course à pied et régler l’emplacement sur extérieur. Vous créez ensuite une HKWorkoutSession en transmettant la configuration.

    À partir de la séance d’entraînement, vous obtiendrez l’outil de création associé et joindrez une source de données.

    Ensuite, appelez Préparer la séance et affichez un compte à rebours de trois secondes pour que les capteurs intégrés s’activent ou qu’un moniteur de fréquence cardiaque externe se connecte. Ce compte à rebours garantit que vous disposez de données dès le début de l’activité d’entraînement. Une fois le compte à rebours terminé, il vous suffit d’appeler startActivity sur la séance et beginCollection sur l’outil de création d’entraînement associé. Il n’est pas nécessaire d’utiliser une requête d’objet ancrée pour mettre à jour votre UI. Le délégué de l’outil de création entraînement fournit à votre app des mises à jour pratiques lorsque de nouvelles données ont été collectées, et gère la synchronisation des données lors de l’enregistrement de l’entraînement.

    Lorsque la personne qui utilise votre app décide de mettre fin à l’entraînement, vous devez appeler stopActivity sur la séance pour permettre à votre outil de création en direct de collecter les données finales.

    Une fois que cette séance est passée à l’état d’arrêt, vous pouvez appeler endCollection sur l’outil de création et terminer l’entraînement. Une fois l’outil de création a terminé, appelez la fin de la séance et affichez le résumé de l’entraînement.

    Maintenant que vous savez lancer un entraînement, voyons les différences entre une séance sur Apple Watch et sur iPhone ou iPad. Une différence essentielle réside dans les capteurs disponibles.

    Sur iPhone et iPad, toutes les activités sont possibles, mais sans capteur de fréquence cardiaque.

    Mais vous pouvez les associer à tout appareil supportant le profil GAT de fréquence cardiaque, comme un capteur portable ou les Powerbeats Pro 2.

    Une fois l’appareil jumelé, HealthKit récupère les données de fréquence cardiaque et les enregistre sous forme d’échantillons dans le Health Store, afin de les mettre à disposition de votre app. Cela signifie qu’il peut y avoir une différence entre les échantillons que vous souhaitez collecter pour votre entraînement et les échantillons que le système peut générer. Passons en revue cette différence.

    Nous avons généré des types. Voici les types de données générées par le système pendant une activité comme les calories et la distance. Et les types collectés, ce sont les données que vous souhaitez observer en direct et ajouter à votre échantillon d’entraînement. Par exemple, si votre app souhaite enregistrer la quantité d’eau consommée pendant une séance d’entraînement, elle devra ajouter les échantillons à la base de données de santé.

    Sur iPhone et iPad, lors de l’initialisation, les types à collecter correctement sur la source de données contiendront tous les types d’échantillons possibles que nous voulons collecter pour l’activité en cours. Par exemple, la fréquence cardiaque est incluse même si elle n’est pas générée par le système, sauf si vous disposez d’un capteur de fréquence cardiaque externe.

    La source de données observera tous les échantillons et types à collecter, générés par le système ou enregistrés par votre app, et les transmettra à l’outil de création en direct.

    Si vous voulez savoir ce que le système génère réellement, vous pouvez utiliser le même délégué d’outil de création que celui que vous utilisez pour mettre à jour les données dans votre UI.

    Si vous souhaitez modifier les types de collecte par défaut, vous pouvez activer ou désactiver la collecte pour les méthodes de type sur la source de données afin d’ajouter ou de supprimer les types souhaités.

    Par exemple, si vous suivez la consommation d’eau pendant un entraînement, votre app appelle Activer la collecte et, pendant que l’entraînement est en cours, ajoute la mesure en tant qu’échantillon à la base de données de santé, et la source de données transmettra automatiquement ces échantillons à votre outil de création en direct. Maintenant que vous savez comment obtenir des données en cours de séance, faisons une courte pause et expliquons comment lire les données après l’enregistrement de l’entraînement.

    Commencez par utiliser les statistiques de l’objet d’entraînement pour afficher un résumé.

    Si vous souhaitez créer un graphique des mesures sur la durée de l’entraînement, vous voudrez utiliser une requête de collecte de statistiques avec l’intervalle souhaité.

    Si votre app a besoin de données détaillées, gardez à l’esprit que la quantité d’échantillons associée à l’exercice peut être supérieure à un. Cela indique que les exemples ont des données plus fines auxquelles vous pouvez accéder à l’aide d’une requête HKQuantitySeriesSampleQuery à la place.

    Vous avez peut-être remarqué que c’est le cas lorsque vous consultez l’historique des entraînements Apple Watch, et cela sera également le cas pour les entraînements enregistrés dans iOS. Génial, vous savez maintenant comment collecter des données lorsque votre app est au premier plan et les lire après l’enregistrement de l’entraînement. Une autre différence clé est que, contrairement à l’Apple Watch, l’iPhone risque de se verrouiller durant l’entraînement. Pour des raisons de confidentialité, les données de santé ne sont pas accessibles quand l’appareil est verrouillé, mais rassurez-vous. La première fois qu’une séance d’entraînement est lancée, le système affiche un message indiquant que les données seront disponibles pour votre app, même lorsque l’appareil est verrouillé. C’est l’occasion idéale pour votre app d’afficher des données clés et des mises à jour en direct sur l’écran verrouillé, sans avoir à déverrouiller le téléphone. Vous vous souvenez de cette invite de confidentialité que je viens de mentionner ? Vous pouvez adapter votre interface pour n’afficher que la durée de l’entraînement, sans aucun indicateur, si les données ne sont pas accessibles ou si la fréquence cardiaque est indisponible.

    Mais ce n’est pas tout ce que vous pouvez faire depuis l’écran de verrouillage. Nous sommes ravis d’intégrer la prise en charge de Siri à l’écran verrouillé. Vous pouvez désormais gérer un entraînement - démarrer, mettre en pause, reprendre, annuler - sans déverrouiller votre téléphone. Une fois le téléphone déverrouillé, HealthKit enregistrera l’entraînement et le mettra à disposition de votre app via le Health Store. Je vous montre comment ajouter à votre app une Intent Siri activable sur écran verrouillé.

    Vous commencez par définir votre gestionnaire d’Intent. Cela doit être géré depuis votre app pour fonctionner sur l’écran de verrouillage. Ensuite, vous voudrez définir les Intents que vous souhaitez prendre en charge. Je les ai dissociés dans cet exemple pour faciliter la lecture. Ensuite, vous gérerez l’Intent entrante. Ici, j’ai reçu une StartWorkoutIntent. Vous commencez par vérifier s’il y a un entraînement de course à pied et renvoyer un échec s’il y en a un. Ensuite, vous devez obtenir le type et l’emplacement de l’activité. Pour cet exemple, je vais simplement le régler sur une course en plein air. Après quoi, vous retournez une réponse de réussite.

    Maintenant que vous avez défini les Intents, vous devez créer un délégué d’app pour y répondre. Vous allez ensuite définir le délégué dans votre app.

    Votre app prend désormais en charge les Intents d’entraînement Siri depuis l’écran verrouillé.

    L’ajout des Intents Siri et des activités en temps réel garantira que les personnes qui utilisent votre app en tireront le meilleur parti, quel que soit l’état de verrouillage de l’appareil. Pour en savoir plus sur ces deux technologies, consultez les pages « Bring your app’s core features to users with App intents » de la WWDC24 et « Meet ActivityKit » de la WWDC23. Vous savez comment obtenir des mesures pendant une séance et comment utiliser les Intents Siri dans les activités en temps réel, passons à la restauration après un plantage. La restauration après un plantage. est disponible sur Watch depuis un certain temps, mais passons en revue trois points clés. Le système relancera automatiquement votre app en cas de plantage. Les séances d’entraînement dans l’outil de création seront restaurées dans leur état précédent. Toutefois, vous devrez configurer à nouveau votre source de données en direct. Pour l’iPhone et l’iPad, nous avons ajouté un nouveau délégué de scène qui vous permettra de récupérer votre entraînement en cours.

    Vous pouvez utiliser le délégué d’app que vous avez créé pour les Intents Siri afin d’ajouter un délégué de scène chargé de la restauration après un plantage. Nous allons commencer par définir notre délégué d’app et vérifier si le paramètre options indique HandleActiveWorkoutRecovery. Nous allons maintenant prendre la séance d’entraînement récupérée depuis le Health Store, en veillant à la transmettre à votre WorkoutManager. Depuis votre WorkoutManager, vous pouvez gérer la poursuite de l’entraînement actif. Si vous vous en souvenez, nous n’avons qu’à recréer notre dataSource.

    Terminons par quelques bonnes pratiques pour les entraînements. Si vous disposez d’une app Watch, veillez à démarrer l’entraînement depuis celle-ci afin d’obtenir tous les indicateurs disponibles. Il vous suffit juste de faire un appel Start Watch App depuis le Health Store. Ensuite, assurez-vous d’afficher l’entraînement sur l’iPhone. Consultez la section « Build a multi-device workout app » de la WWDC23 pour en savoir plus.

    Votre app doit uniquement demander une autorisation pour les types de données dont vous avez besoin. Évitez que vos utilisateurs s’interrogent sur la nécessité d’autorisations pour des données sans lien avec votre app. Enfin, utilisez toujours l’API de création d’entraînement pour créer et sauvegarder un entraînement. Cela permettra de s’assurer que les anneaux Activité sont correctement mis à jour.

    Voilà comment suivre vos entraînements avec HealthKit sur iPhone et iPad. Avec cette mise à jour, ces appareils disposent d’une API robuste avec récupération après plantage et la possibilité d’afficher et de gérer les entraînements même lorsque l’écran est verrouillé. Voici les prochaines étapes avant de conclure. Assurez-vous de télécharger l’app de démonstration jointe à cette séance. Elle contient tout le code que j’ai partagé aujourd’hui dans un exemple entièrement fonctionnel que vous pouvez utiliser pour commencer. Si vous avez déjà une app sur iPhone ou iPad, assurez-vous de passer aux API Workout Builder dont j’ai parlé aujourd’hui. Je pense que vous apprécierez ces améliorations. Si vous disposez déjà d’une app pour Apple Watch, la prise en charge multiplateforme pour la même API signifie que votre app bénéficie d’un tout nouveau marché pour ceux qui ne possèdent pas d’Apple Watch. Bon nombre des fonctionnalités que nous implémentons sont le résultat direct de vos feedbacks, alors continuez à commenter. Nous voulons prendre en charge les fonctionnalités dont vous avez besoin pour continuer à créer ces apps incroyables et préserver la santé. Merci de votre attention.

    • 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.

Developer Footer

  • Vidéos
  • WWDC25
  • Suivez vos entraînements avec HealthKit sur iOS et iPadOS
  • Open Menu Close Menu
    • iOS
    • iPadOS
    • macOS
    • tvOS
    • visionOS
    • watchOS
    Open Menu Close Menu
    • Swift
    • SwiftUI
    • Swift Playground
    • TestFlight
    • Xcode
    • Xcode Cloud
    • Icon Composer
    • SF Symbols
    Open Menu Close Menu
    • Accessibility
    • Accessories
    • App Store
    • Audio & Video
    • Augmented Reality
    • Business
    • Design
    • Distribution
    • Education
    • Fonts
    • Games
    • Health & Fitness
    • In-App Purchase
    • Localization
    • Maps & Location
    • Machine Learning & AI
    • Open Source
    • Security
    • Safari & Web
    Open Menu Close Menu
    • Documentation
    • Sample Code
    • Tutorials
    • Downloads
    • Forums
    • Videos
    Open Menu Close Menu
    • Support Articles
    • Contact Us
    • Bug Reporting
    • System Status
    Open Menu Close Menu
    • Apple Developer
    • App Store Connect
    • Certificates, IDs, & Profiles
    • Feedback Assistant
    Open Menu Close Menu
    • Apple Developer Program
    • Apple Developer Enterprise Program
    • App Store Small Business Program
    • MFi Program
    • News Partner Program
    • Video Partner Program
    • Security Bounty Program
    • Security Research Device Program
    Open Menu Close Menu
    • Meet with Apple
    • Apple Developer Centers
    • App Store Awards
    • Apple Design Awards
    • Apple Developer Academies
    • WWDC
    Get the Apple Developer app.
    Copyright © 2025 Apple Inc. All rights reserved.
    Terms of Use Privacy Policy Agreements and Guidelines