Cómo leer datos de salud (HealthKit) con Swift: Mi experiencia creando una App de Fitness

Guía Definitiva: Cómo leer datos de HealthKit con Swift – Mi experiencia creando una App de Fitness

En la era del bienestar digital, los desarrolladores de iOS tenemos una herramienta sumamente poderosa a nuestra disposición: HealthKit. Esta infraestructura de Apple no solo centraliza la información de salud y actividad física de millones de usuarios, sino que permite que aplicaciones de terceros (como la que yo mismo desarrollé) interactúen con esos datos para ofrecer una experiencia personalizada.

Cuando decidí crear mi propia aplicación de fitness, me enfrenté a una curva de aprendizaje interesante. No se trata solo de escribir código, sino de entender la filosofía de privacidad de Apple y la estructura de datos que maneja el Apple Watch y el iPhone. En este artículo, te contaré mi experiencia y te guiaré paso a paso sobre cómo leer datos de HealthKit utilizando Swift.


1. ¿Qué es HealthKit y por qué es vital para tu App de Fitness?

HealthKit no es una base de datos convencional. Es un framework que actúa como mediador entre los sensores del dispositivo (y accesorios como el Apple Watch) y las aplicaciones.

Para mi proyecto, HealthKit fue fundamental por tres razones:

  • Centralización: No necesité crear un algoritmo para contar pasos; simplemente le pedí a Apple los datos que ya había recolectado.
  • Confianza: Los usuarios confían en el ecosistema de Apple. Al usar HealthKit, delegas la seguridad de los datos sensibles a la infraestructura de la compañía.
  • Interoperabilidad: Si el usuario usa una báscula inteligente de otra marca, mi app puede leer ese peso automáticamente si esa marca escribe en HealthKit.

2. Configuración Inicial: Preparando el terreno en Xcode

Antes de escribir la primera línea de código, debes configurar tu proyecto. Si saltas este paso, tu aplicación se cerrará inesperadamente (crash) al intentar acceder a los datos.

Habilitar las «Capabilities»

  1. Abre tu proyecto en Xcode.
  2. Selecciona el Target de tu app.
  3. Ve a la pestaña Signing & Capabilities.
  4. Haz clic en el botón «+ Capability» y busca HealthKit.

Configurar el archivo Info.plist

Apple es sumamente estricto con la privacidad. Debes explicarle al usuario por qué quieres acceder a sus datos. Debes añadir estas dos claves en tu archivo Info.plist:

  • Privacy - Health Share Usage Description: Para leer datos.
  • Privacy - Health Update Usage Description: Para escribir datos (si tu app lo requiere).

Ejemplo de mensaje: «Utilizamos tus datos de actividad para calcular tus metas diarias de calorías.»


3. Solicitando Permisos: El flujo de autorización

Una de las lecciones que aprendí es que el usuario tiene el control total. Pueden darte permiso para leer los pasos, pero no para leer la frecuencia cardíaca. Tu código debe ser resiliente ante estas decisiones.

Primero, necesitamos instanciar el HKHealthStore, que es el punto de entrada a todos los datos de salud.

import HealthKit

let healthStore = HKHealthStore()

func requestAuthorization() {
    // Definimos los tipos de datos que queremos leer
    let typesToRead: Set = [
        HKObjectType.quantityType(forIdentifier: .stepCount)!,
        HKObjectType.quantityType(forIdentifier: .heartRate)!,
        HKObjectType.quantityType(forIdentifier: .activeEnergyBurned)!
    ]

    // Verificamos si HealthKit está disponible en el dispositivo
    guard HKHealthStore.isHealthDataAvailable() else {
        print("HealthKit no está disponible en este dispositivo.")
        return
    }

    // Solicitamos la autorización
    healthStore.requestAuthorization(toShare: nil, read: typesToRead) { (success, error) in
        if success {
            print("Autorización concedida")
        } else {
            print("Error en la autorización: \(String(describing: error?.localizedDescription))")
        }
    }
}

4. Leyendo Datos: Cómo obtener el conteo de pasos

Una vez que tenemos el permiso, llega la parte emocionante: leer los datos. En mi app, el «dashboard» principal mostraba los pasos del día actual. Para lograr esto, utilizamos HKSampleQuery o, más modernamente, HKStatisticsQuery.

Aquí te muestro cómo realizar una consulta para obtener los pasos totales de hoy:

func fetchTodaySteps() {
    let stepsQuantityType = HKQuantityType.quantityType(forIdentifier: .stepCount)!

    let now = Date()
    let startOfDay = Calendar.current.startOfDay(for: now)
    let predicate = HKQuery.predicateForSamples(withStart: startOfDay, end: now, options: .strictStartDate)

    let query = HKStatisticsQuery(quantityType: stepsQuantityType, quantitySamplePredicate: predicate, options: .cumulativeSum) { (_, result, error) in
        guard let result = result, let sum = result.sumQuantity() else {
            print("No se pudieron obtener los pasos.")
            return
        }

        let steps = sum.doubleValue(for: HKUnit.count())
        DispatchQueue.main.async {
            print("Pasos de hoy: \(Int(steps))")
            // Aquí actualizarías tu interfaz de usuario
        }
    }

    healthStore.execute(query)
}

5. Mi Experiencia Personal: Desafíos y Lecciones Aprendidas

Crear una app de fitness suena sencillo, pero el diablo está en los detalles. Durante el desarrollo, me encontré con varios obstáculos que me hicieron replantear la arquitectura:

El problema de las unidades

No todo el mundo mide igual. Mientras que en España usamos kilómetros y kilocalorías, en otros mercados prefieren millas. HealthKit facilita esto con HKUnit, pero debes asegurarte de manejar las conversiones correctamente para no mostrar datos erróneos.

Datos duplicados

Si el usuario lleva el iPhone en el bolsillo y el Apple Watch en la muñeca, HealthKit recibe dos fuentes de datos. La ventaja es que HKStatisticsQuery hace un gran trabajo filtrando duplicados, pero si haces una consulta de muestras crudas (HKSampleQuery), verás múltiples entradas para el mismo minuto. Consejo: Confía siempre en las consultas estadísticas para evitar el conteo doble.

La «Falsa» Autorización

Apple no te dice si el usuario denegó el permiso por razones de privacidad. Si el usuario desactiva el interruptor, la app simplemente recibirá «cero datos» o resultados vacíos. Tu UI debe estar preparada para manejar estados donde no hay datos sin parecer que la app está rota.


6. Buenas Prácticas para el manejo de datos de salud

Si quieres que tu app sea exitosa y aprobada por la App Store, sigue estas recomendaciones:

  • Minimiza la solicitud de datos: No pidas acceso a la «Frecuencia respiratoria» si solo vas a mostrar «Pasos». Pide solo lo estrictamente necesario.
  • Explica el valor: Antes de lanzar el popup de Apple, muestra una pantalla propia explicando qué ganará el usuario al compartir sus datos.
  • Gestión de batería: Las consultas constantes a HealthKit pueden drenar la batería. Usa HKObserverQuery si necesitas actualizaciones en segundo plano, pero hazlo con moderación.
  • Seguridad: Nunca almacenes datos de HealthKit en servidores externos sin un cifrado de extremo a extremo y un consentimiento explícito adicional. La privacidad es la base de la confianza en apps de salud.

7. Conclusión

Integrar HealthKit en mi app de fitness cambió por completo la propuesta de valor del proyecto. Pasó de ser una simple calculadora manual a un compañero inteligente que motiva al usuario basándose en su actividad real.

Swift hace que el proceso sea muy fluido gracias a su sintaxis clara y al robusto framework que Apple proporciona. Aunque la gestión de permisos y la limpieza de datos pueden ser retadoras al principio, el resultado final —una app integrada perfectamente en el ecosistema de salud del usuario— vale totalmente el esfuerzo.

Si estás pensando en crear una aplicación de bienestar, no reinventes la rueda. Aprovecha el poder de HealthKit, respeta la privacidad de tus usuarios y enfócate en crear una experiencia única que los ayude a vivir una vida más saludable.

¿Estás listo para escribir tu primera consulta de salud? ¡El código te espera!

Deja una respuesta