Contenido del curso

Integración Nativa en iOS 18

Contador de pasos con HealthKit en iOS

Resumen

Si quieres construir una app de salud en iOS, HealthKit es el framework que conecta tu aplicación con la app Salud del iPhone para leer datos como pasos, ritmo cardíaco o sueño. Aquí te explico cómo armar una pantalla en SwiftUI que muestre los pasos del día, de la mañana, de los últimos siete días y desde el último reinicio del dispositivo.

¿Qué es HealthKit y por qué lo usamos para contar pasos?

HealthKit es un framework de iOS que centraliza datos de salud y fitness en el dispositivo. En lugar de pedir permisos con un diálogo flotante como ocurre con la cámara o la localización, HealthKit te lleva directamente a la app Salud para que el usuario decida qué información compartir contigo.

¿Qué es HealthKit? Es un framework de Apple que permite a tu app leer y escribir datos de salud almacenados en la app Salud del iPhone, como conteo de pasos, ritmo cardíaco, sueño o ciclismo.

Antes de tocar código, debes habilitar la capability en tu proyecto. Entras a Signing & Capabilities, haces clic en agregar y buscas HealthKit. También conviene activar HealthKit Background Delivery si vas a rastrear pasos en segundo plano [00:38].

¿Cómo solicito autorización al usuario para leer pasos?

La autorización es el primer paso obligatorio. Sin ella, tu app no puede leer absolutamente nada de la app Salud.

Dentro de tu clase HealthStore importas HealthKit y creas una referencia a HKHealthStore, que es la clase que maneja todas las operaciones contra el framework [02:34]. Sobre esa instancia llamas a requestAuthorization, especificando qué tipos de datos quieres leer.

Para pasos defines el tipo así:

swift let stepType = HKQuantityType.quantityType(forIdentifier: .stepCount)!

Luego verificas con un guard que el healthStore exista y llamas a la solicitud:

swift healthStore.requestAuthorization(toShare: [], read: [stepType]) { success, error in completion(success) }

El parámetro toShare va vacío porque solo vas a leer, no escribir. Cuando esto se ejecuta por primera vez, el sistema abre la app Salud y pregunta al usuario si quiere compartir los pasos con tu aplicación [05:30].

¿Cómo calculo los pasos en distintos rangos de fecha?

La estrategia es tener una sola función calculateSteps que recibe una colección estadística y, desde la vista, definir los rangos específicos: hoy, esta mañana, últimos siete días o desde el reinicio del dispositivo.

Configurando la consulta con HKStatisticsCollectionQuery

Dentro de calculateSteps defines tres piezas clave:

  • El tipo de dato a leer, que sigue siendo stepCount.
  • La fecha de inicio, calculada con Calendar.current.date(byAdding: .day, value: -7, to: Date()) para obtener siete días atrás [09:13].
  • El intervalo de agrupación, configurado en días para que los resultados vengan separados día por día y no como una suma global.

Luego construyes un NSPredicate con la fecha inicial, la fecha final y las opciones, y lo pasas a la query. Al ejecutarla, HealthKit te devuelve una colección estadística que iteras para sumar los pasos.

¿Qué hace enumerateStatistics? Recorre cada intervalo dentro del rango de fechas y te entrega el resultado parcial, que tú vas acumulando en una variable global.

Definiendo cuatro rangos en SwiftUI

En la vista creas cuatro variables de estado tipo Double inicializadas en 0.0: stepsLast7Days, stepsThisMorning, stepsThisDay y stepsFromBoot [12:24]. Cada una se llena con una función específica que ajusta el rango.

  • Últimos siete días. Fecha inicial con value: -7 en días, fecha final igual a Date().
  • Esta mañana. Fecha inicial usando bySettingHour: 0, minute: 0, second: 0 y fecha final con hora 12.
  • Todo el día de hoy. Desde las 0 horas hasta las 23:59:59 del día actual.
  • Desde el reinicio del dispositivo. Calculas el bootTime con ProcessInfo.processInfo.systemUptime casteado a entero y restándolo en segundos a la fecha actual [18:42].

¿Cuándo inicializo HealthKit dentro de la vista?

En SwiftUI conectas el ciclo de vida de la vista con dos modificadores: onAppear, que se dispara la primera vez que se pinta la pantalla, y onChange, que reacciona a cambios o refrescos por gestos del usuario. Ambos llaman a una función initHealthKit [13:35].

Dentro de initHealthKit solicitas la autorización y, si recibes success == true, llamas a calculateSteps pasándole una closure que distribuye la colección estadística a las cuatro funciones de rango: getStepsFromLastSevenDays, getStepsFromThisMorning, getStepsFromThisDay y getStepsFromDeviceBoot.

¿Cómo muestro los pasos formateados en la interfaz?

En cada HStack agregas un Text que lee la variable correspondiente. Como son Double, conviene formatearlos para que no muestren decimales innecesarios:

swift Text("(stepsLast7Days, specifier: "%.0f")")

El especificador %.0f te devuelve solo el entero, sin decimales colgando. Repites el patrón con stepsThisMorning, stepsThisDay y stepsFromBoot [21:08].

¿Por qué no puedo probar HealthKit en el simulador?

Porque el simulador no genera pasos reales. Necesitas un dispositivo físico para validar el conteo. Al ejecutar la app en un iPhone real, se abre la app Salud, habilitas la opción Pasos, das Permitir y los valores empiezan a actualizarse a medida que caminas [22:16].

¿Qué otra métrica de salud te gustaría integrar a continuación, ritmo cardíaco o etapas de sueño? Cuéntame en los comentarios.