HealthKit

HK

HealthKit es un framework de desarrollo usado para acceder a datos almacenados en la Health app. Health app sirve como un repositorio central para datos de salud y fitness en iOS. Con el permiso del usuario, las apps construidas con HealthKit pueden comunicarse con la Health app para acceder y compartir informacion. Un usuario puede permitir, por ejemplo, que una app de nutricion obtenga datos sobre el peso y las actividades diarias de forma que la app pueda definir un consumo optimo de calorias y hacer recomendaciones nutricionales.

Threading. El almacèn de HealthKit (HealthKit Store) opera bajo un hilo seguro (thread-safe), y gran parte de sus objetos son inmutables. Tambien se puede usar en multiprocesos (multithreaded). Tanto el iPhone como el Apple Watch almacenan los datos del healthkit por separado pero se pueden sincronizar automaticamente, sin embargo, para guardar espacio el Apple Watch elimina datos que sean muy antiguos. HealthKit no esta disponible para iPad

Privacidad del Usuario.

Los datos de HealthKit deben ser almacenados localmente en el dispositivo del usuario. El almacén para HealthKit es encriptado cuando el dispositivo es bloqueado y solo puede ser accesado por una app autorizada. Como resultado, no se pueden leer datos del almacenamiento del Healthkit cuando el app trabaja en un hilo secundario, sin embargo, las apps a desarrollar pueden seguir escribiendo datos en el almacenamiento incluso cuando el dispositivo esta bloqueado. Healthkit toma estos datos y los guarda en el almacenamiento encriptado tan pronto como el celular es desbloqueado.

Al trabajar con Health app es importante tomar en cuenta los siguientes puntos:

  • Pide acceso a los datos de salud solamente cuando sea necesario.
  • Usa la pantalla de permiso standard para aclarar que se quiere acceder a los datos de salud. Evita añadir vistas diferentes de la vista standard para pedir permisos.
  • Siempre que se compartan datos de salud se debe hacer a traves de Settings > Privacy del sistema.
  • No uses iconos, imagenes y screenshots de la Health app en tu app de desarrollo, esto por motivos de copyright.
  • No uses el termino HealthKit. Si necesitas explicar que tu app trabaja con datos de este framework, usa el termino Health app.
  • HealthKit esta disenado igualmente para administrar y combinar datos de multiples dispositivos.
  • El app ha desarrollar no debe acceder al API de HealthKit a menos que este diseñada precisamente para ofrecer servicios fitness o de salud.
  • El rol de la app debe dejar en claro que cualquier marketing y/o diseño de interfaz de usuario es sobre servicios fitness y/o de salud. No se debe usar datos del HealthKit para dar servicio a cualquier tipo de publicidad, o vender datos a revendedores de informacion o plataformas de publicidad.
  • Únicamente se deben compartir datos del HealthKit a terceros si estos tambien proveen servicios fitness o de salud al usuario que, al mismo tiempo, debe dar permiso para que se compartan.
  • Se debe explicar claramente al usuario como se usaran sus datos.
  • Si la app en desarrollo requiere acceso a archivos con datos clinicos especificos para funcionar, hay que especificar los tipos de archivos clinicos requeridos en el Info.plist de la app usando la llave siguiente: lNSHealthRequiredReadAuthorizationTypeIdentifiers.
  • Se deben crear politicas de privacidad para cualquier app que use el framework de HealthKit. Se puede encontrar documentacion para crear politicas de privacidad en los siguientes sitios:

HealthKit Data.

Los developers no pueden crear tipos o unidades de datos propios al trabajar con HealthKit, en su lugar, se provee una amplia variedad de los mismos. De igual forma se provee un gran numero de clases y subclases. Los tipos de datos que HealthKit puede ofrecer en su almacèn (store) son:

  • Characteristic data. Estos representan items que tipicamente no cambian como el cumpleaños del usuario, tipo de sangre, sexo y tipo de piel.
  • Sample data. Gran parte de los datos de salud del usuario son almacenados en samples que representan datos en un punto particular del tiempo.
  • Workout data. Información sobre fitness y ejercicios son almacenados en HKWorkout samples, por ejemplo.
  • Source data. Cada sample almacena informacion sobre su origen, por ejemplo, el objeto HKSourceRevision contiene informacion sobre la app o el dispositivo que almacena el tipo de sample, y el objeto HKDevice contiene informacion sobre el hardware del dispositivo que genero los datos.
  • Deleted objects. Una instancia de HKDeletedObject es usada para almacenar temporalmente el UUID de un item que ha sido eliminado del almacen (store) de HealthKit.

Object properties y Samples

La clase HKObject es la superclase de todos los tipos de samples que administra HealthKit. Todas sus subclases son inmutables y cada objeto de la clase tiene las siguientes propiedades:

  • UUID. Un identificador unico para cada tipo de log o entrada.
  • Metadata. Es un diccionario con informacion adicional sobre la entrada.
  • Source Revision. La fuente del sample. Dicha fuente puede ser un dispositivo que guarde directamente datos hacia HealthKit o una app que use este framework.
  • Device. El hardware del dispositivo que genero los datos almacenados en el sample.

Para crear cualquier tipo de objeto, se debe llamar un metodo de la clase HKObjectType, y pasar el tipo deseado de identificador.

let bloodType = HKObjectType.characteristicType(forIdentifier: .bloodType)

let caloriesConsumed = HKObjectType.quantityType(forIdentifier: .dietaryEnergyConsumed)

let sleepAnalysis = HKObjectType.categoryType(forIdentifier: .sleepAnalysis)

La clase HKSample es una subclase de HKObject. Los objetos Sample son aquellos que representan datos en cualquier punto particular del tiempo y tienen las siguientes propiedades:

  • Type. El tipo de sample como analisis de sueño, estatura o conteo de pasos.
  • Start date. Tiempo de inicio de procesamiento de datos del sample.
  • End date. Tiempo final del sample.

    A su vez, los samples estan divididos en 4 subclases concretas:

    • Category samples. Datos que pueden ser clasificados en un set finito de categorias.
    • Quantity samples. Datos que pueden ser almacenados como valores numericos. Se incluyen estatura y peso, temperatura corporal, pulso cardiaco, conteo de pasos, etc.
    • Correlations. Compuesto de datos que representan uno o mas samples de comida o presion arterial.
    • Workouts. Datos que representan actividades fisicas como correr, nadar o jugar. Estos generalmente tienen propiedades de tipo, duracion, distancia y calorias quemadas.

Implementación del HealthKit (HealthKit Setup).

Para usar HealthKit se tienen que atender los siguientes pasos:

1. Habilitar HealthKit en tu app.

Dentro de Xcode, selecciona el proyecto y habilita HealthKit. Solo habilita Health Records si tu app necesita acceso al historial clinico del usuario. Al subir tu app al App Store, la revision de apps (App Review) puede rechazar apps que habiliten Health Records si la app no usa ningun dato del historial clinico.

Enable HealthKit capabilities

Mas información para habilitar capacidades en la configuracion del HealthKit -> Configuracion de HealthKit

Cuando se habilita HealthKit en una app de iOS, Xcode añade HealthKit a la lista de capacidades requeridas del dispositivo, esto previene que usuarios con dispositivos que no tengan disponible HealthKit puedan comprar o instalar la app.

2. Asegurar que HealthKit este disponible en el dispositivo actual.

Usa el metodo isHealthDataAvailable() para confirmar si HealthKit esta disponible en el dispositivo del usuario.

if HKHealthStore.isHealthDataAvailable() {
    // Add code to use HealthKit here.
}

Usa este metodo antes de usar cualquier otro metodo de HealthKit. Si Healthkit no esta disponible en el dispositivo, los metodos consecuentes fallaran con el error: errorHealthDataUnavailable (Por ej. en Ipads). Si el HealthKit esta restringido, los metodos consecuentes fallaran con el error: errorHealthDataRestricted.

3. Crear tu almacén de HealthKit (HealthKit Store).

Si HealthKit esta disponible y habilitado, instancia un objeto de HKHealthStore:

let healthStore = HKHealthStore()

Solo se necesita una sola instancia de este objeto por app. Creas el store una vez y la referencua se guarda para usos posteriores.

4. Solicitar permisos para leer y compartir datos.

Para proteger la privacidad del usuario, HealthKit requiere autorizaciones especificadas. Se debe pedir permiso tanto para leer como para compartir cada tipo de dato usado en la app antes de acceder o guardar los datos, sin embargo, no se necesitan permisos para acceder a todos los tipos de datos al mismo tiempo, en lugar de esto solo pide el permiso cada vez que se necesite acceso a cada cierto tipo de dato.

En el siguiente ejemplo se configuran los datos para lectura que en este caso son conteo de pasos y sexo, y tambien se configura el conteo de pasos para escritura. (en sexo no se puede escribir ningun dato). Finalmente se pide autorizacion y se pasan los datos de lectura al parametro read y los datos de escritura al parametro toShare .

let healthStore = HKHealthStore()

override func viewDidLoad() {
    super.viewDidLoad()
    // Do any additional setup after loading the view, typically from a nib.

    if HKHealthStore.isHealthDataAvailable() {
        let readDataTypes : Set = [HKObjectType.quantityType(forIdentifier: HKQuantityTypeIdentifier.stepCount)!,
                               HKObjectType.characteristicType(forIdentifier: HKCharacteristicTypeIdentifier.biologicalSex)!]

        let writeDataTypes : Set = [HKObjectType.quantityType(forIdentifier: HKQuantityTypeIdentifier.stepCount)!]

        healthStore.requestAuthorization(toShare: writeDataTypes, read: readDataTypes) { (success, error) in
            if !success {
                // Handle the error here.
            } else {
                // Do the work
            }
        }
    }
}

Cada vez que tu app pida permisos, el sistema desplegará una vista con los tipos de datos que requieran permisos.

Request permission for the Fit app

Tambien se deben proveer mensajes que soliciten el permiso para leer o escribir datos de HealthKit. En el Info.plist de tu app usa la llave NSHealthShareUsageDescription para configurar el mensaje de escritura de datos. Si el usuario concede permisos para compartir datos de algun tipo en especifico, se pueden crear samples de ese tipo y guardarlos en el almacen de HealthKit (HealthKit Store), sin embargo, antes de guardar cualquier dato, se debe revisar si el app esta autorizada para compartir los datos usando el metodo: authorizationStatus(for:). Si no se ha pedido permisos, cualquier intento de guardar datos mandara un error de tipo: HKError.Code.errorAuthorizationNotDetermined.

Guardar datos en HealthKit.

Cuando se trata de guardar datos en HealthKit, se debe trabajar con samples. Puedes crear samples nuevos y añadirlos al almacen (HealthKit Store). Aunque cada sample se rige por un metodo diferente de configuracion, comparten un proceso similar:

  1. Revisa el tipo de identificador de tus datos. Por ejemplo, para guardar el peso de un usuario, se usa bodyMass como identificador. Revisar Tipo de datos
  2. Usa el metodo adecuado en la clase HKObjectType para crear el tipo de objeto correcto para tus datos. Por ejemplo, para guardar el peso, se deberia crear un objeto del tipo HKQuantityType usando el metodo quantityType(forIdentifier:).
  3. Instancia el objeto de la subclase HKSample correspondiente usando el tipo de objeto.
  4. Guarda el objeto en el Store usando el metodo: save(_:withCompletion:).

Al guardar datos al almacen de HealthKit, se debe escoger entre usar un solo sample para representar los datos o dividir los datos en multiples y pequeñoa samples. Un sample grande es mas eficiente, sin embargo, multiples y pequeños samples proveen al usuario una persepcion mas detallada de como cambian los datos a traves del tiempo. Por ejemplo, al trabajar con rutinas de ejercitamiento (workouts), se puede escojer un muestre de alta frecuencia (de un minuto o menos por sample) para proveer estadisticas de intensidad y analizar el rendimiento detallado del usuario durante una rutina. Por otra parte, para actividades menos intensas, como conteo de pasos, seria recomendable usar samples muestreados de una hora o menos. Esto permite producir graficas utiles del registro de datos por hora o un dia, sin embargo, las apps deberian evitar guardar samples de datos mayores a 24 horas.

Crear y Compartir HealthKit Samples

Al guardar gran parte de los datos de salud y fitness en HealthKit se usa una subclase de HKSample. Todas las subclases de samples guardan informacion en un momento determinado. Por ejemplo, si los samples de startDate y endDate son los mismos, el sample en general es un punto unico en el tiempo. Si endDate termina despues de startDate, el sample es un intervalo de tiempo.

HealthKit usa diferentes subclases de HKSample para almacenar diversos tipos de datos:

  • Objetos de tipoHKQuantitySample almacenan cantidades, valores numericos y unidades. (Ej. Altura, ritmo cardiaco, calorias consumidas, etc.)
    • Guardar Quantity Samples en HealthKit Tutorial.
  • Objetos de tipo HKCategorySample almacenan una sola opcion de una lista pequeña. (Ej. Datos de fases del sueño como, “en cama”, “durmiendo” o “despierto”).
    • Guardar Category Samples en HealthKit Tutorial.
  • Objetos de tipo HKCorrelation combinan dos o mas samples en un solo valor. (Ej. Alimentos y presion sanguinea) .

  • HealthKit tambien tiene mas subclases de algunos samples para representar tipos de datos mas especializados. (Ej. HKCDADocumentSample, HKWorkoutRoute, HKWorkout) .

Leer Datos de HealthKit.

Existen tres formas principales de accesar a los datos del almacen de Healthkit:

  • Usando metodos. HealthKit store provee metodos especificos para accesar datos caracteristicos.
    • Leer datos caracteristicos de HealthKit Tutorial.
  • Usando Queries. Queries devuelven un snapshot o ‘pantallazo’ de los datos requeridos del HealthKit store.
  • Long-running queries. Estos queries corren en el background de la aplicacion y actualizan la app cada vez que exista un cambio realizado en el HealthKit store.
    • Usar Long-Running HKActivitySummaryQuery de HealthKit Tutorial.

Usar Queries para solicitar sample datos de HealthKit

Los Queries pueden ser usados para enlistar todas las fuentes de un tipo particular de dato, o realizar calculos estadisticos. Por ejemplo, queries estadisticos pueden calcular el ritmo cardiaco minimo y maximo por una semana, o el total de pasos realizados en un dia. Para usar un query se usa el metodo **execute(:)**. Al llamar este metodo, un _snapshot de los datos actuales es devuelto asincronamente al handler de resultados del query.

HealthKit provee diferentes tipos de queries, cada uno designado a devolver diferentes tipos de datos al almacen (HealthKit store):

Fuente

Health & Fitness Videos for iOS developers