-
Acompanhe exercícios com o HealthKit no iOS e iPadOS
Conheça as melhores práticas para criar uma ótima experiência de exercício no iOS. Revise o ciclo de vida de uma sessão de exercício, explore as diferenças entre os treinos no Apple Watch e no iPhone e saiba como usar as Atividades ao Vivo e a Siri para melhorar a experiência do seu app na Tela Bloqueada.
Capítulos
- 0:00 - Introdução
- 0:56 - Realizar uma sessão de exercício
- 2:50 - Obter as métricas da sessão
- 8:35 - Recuperar após um falha
- 9:34 - Melhores práticas
Recursos
- Handling Workout Requests with SiriKit
- Running workout sessions
- Building a workout app for iPhone and iPad
- Building a multidevice workout app
- HKWorkoutSession
Vídeos relacionados
WWDC25
WWDC24
WWDC23
-
Buscar neste vídeo...
-
-
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 - Introdução
O framework HealthKit permite que apps de saúde e boa forma acessem um banco de dados criptografado centralizado com dados de saúde do usuário. Com as APIs da plataforma, você pode criar apps de exercícios para iPhone e iPad que as pessoas podem usar para acompanhar treinos, acessar métricas de saúde e receber informações sobre recuperação. Aprenda o básico sobre sessões de exercícios, como acessar métricas durante os treinos, como lidar com falhas e como fornecer dicas e práticas recomendadas.
- 0:56 - Realizar uma sessão de exercício
O mesmo código pode ser usado no iPhone, no iPad e no Apple Watch com pequenos ajustes. Para monitorar qualquer atividade, crie uma configuração de treino, defina o tipo e inicie uma sessão. O criador de exercícios coleta métricas de saúde durante o treino.
- 2:50 - Obter as métricas da sessão
Ao executar um treino no Apple Watch, os sensores integrados do dispositivo proporcionam uma experiência perfeita. Por outro lado, a coleta de dados de frequência cardíaca no iPhone ou iPad requer o emparelhamento com um sensor de frequência cardíaca externo, pois esses aparelhos não têm um. O iPhone e o iPad podem coletar várias métricas de treino, mas o sistema pode gerar amostras diferentes daquelas especificamente solicitadas por um app. Você pode modificar os tipos padrão de dados coletados durante um treino. Depois que alguém salva um treino, você pode acessar e exibir estatísticas resumidas ou métricas em gráficos ao longo do tempo. Os treinos do iPhone podem ter dados mais refinados disponíveis para determinadas métricas, semelhante ao histórico de exercícios do Apple Watch. O iPhone normalmente é bloqueado durante os treinos. Por motivos de privacidade, os dados de saúde geralmente não ficam acessíveis enquanto o dispositivo está bloqueado. No entanto, o sistema pode solicitar que alguém permita o acesso aos dados do treino a apps mesmo quando bloqueados. Você pode então exibir atividades ao vivo na Tela Bloqueada, mostrando métricas cruciais sem que a pessoa precise desbloquear o telefone. A compatibilidade com a Siri se estende para a Tela Bloqueada, permitindo iniciar, pausar, retomar ou cancelar exercícios sem usar as mãos. Você pode integrar as intenções da Siri aos seus apps para ativar essa funcionalidade.
- 8:35 - Recuperar após um falha
A recuperação de falhas no Apple Watch reinicia apps e restaura automaticamente as sessões de treinos. No iPhone e iPad, um novo delegado de cena cuida da recuperação das sessões de treino após uma falha. Você pode usar esse delegado para verificar opções de recuperação e reaver as sessões recuperadas do app Saúde.
- 9:34 - Melhores práticas
Para monitorar a eficiência dos treinos com o HealthKit, espelhe os exercícios iniciados no app Apple Watch para iPhone, solicite autorização apenas para os dados necessários e use a API do criador de exercícios. Com essas recomendações, você garante atualizações precisas dos círculos de Atividade e aprimora a experiência do usuário. Também faça upgrade para as novas APIs, baixe o app de demonstração e adicione suporte a exercícios para iPhone e iPad para expandir seu alcance de mercado.