Apple HealthKit

La llegada de iOS 8 actualizó los dispositivos Apple y añadió nuevas funcionalidades, algunas de ellas relacionadas con la salud.

Estas actualizaciones en el campo de la salud tienen mayor relevancia con la salida al mercado del Apple Watch.

Una de las novedades fue la aplicación de Apple: Health app, que centraliza los datos de salud del usuario así como su condición física.

Esta aplicación muestra datos de los sensores internos de los dispositivos Apple y de aplicaciones de terceros que recogen información sobre el estado físico del usuario.

Dispone de un panel en el que, de un solo vistazo, es posible conocer la información que estamos monitorizando, además de disponer de históricos, gráficos, resúmenes o de la posibilidad de crear una tarjeta de emergencias accesible desde la pantalla de bloqueo.

Otra novedad, importante de cara a los desarrolladores iOS, es la posibilidad de usar el nuevo kit de salud: Apple HealthKit.

Con el uso de este nuevo servicio, las aplicaciones de salud y deporte pueden, de una forma segura, almacenar y compartir datos con otras aplicaciones y donde es el usuario quien decide, en última instancia, cuales de sus datos quiere compatir.

En Solid GEAR tenemos algunos proyectos de salud donde hemos hecho uso del framework HealthKit.

Para comenzar a hacer uso de HealthKit en una aplicación iOS es necesario que el provisioning profile incluya soporte para HealthKit y activarlo en el apartado «Capabilities» del target.

Config Health Kit

Una vez que el framework está añadido a nuestro proyecto podemos empezar a usarlo.

Es importante remarcar que HealthKit usa objetos de tipo HKObjectType para almacenar la información.

Sin embargo nunca se ha de instaciar directamente un objecto HKObjectType, es necesario usar alguna de sus subclases que se pueden dividir en dos grupos: HKCharacteristicType and HKSampleType.

La clase HKCharacteristicType, representa aquellos datos que típicamente no van a cambiar nunca.

Estos datos tienen que ser añadidos y editados directamente por el usuario en Health app y no podrán ser modificados por otras aplicaciones únicamente consumidos cuando el usuario lo permita.

Son 3 tipos: Sexo biológico, grupo sanguíneo y fecha de nacimiento.

La clase HKSampleType, se usa para representar muestras de datos y engloba las subclases: HKCategoryType, HKCorrelationType, HKQuantityType y HKWorkoutType.

  • · HKCategoryType: Usado para representar los datos que se pueden clasificar en un enumerado. Únicamente se usa para guardar datos sobre el análisis del sueño.
  • · HKCorrelationType: Para trabajar con correlaciones, objetos que agrupan varias muestras en una sola entrada de datos.
  • · HKQuantityType: Para crear muestras que almacenan un único valor numérico.
  • · HKWorkoutType: Se emplea para crear consultas para objetos de entrenamiento.

Para empezar a leer y escribir datos en HealthKit es importante que el usuario lo permita, cómo ya se ha indicado previamente.
La pantalla que verá el usuario en su dispositivo es como la mostrada a continuación, donde aparecen, individualmente, cada uno de los datos que se pretende leer y/o escribir.

Authorization view healthkit

En nuestro código tendremos un objeto HKHealthStore:

var healthStore = HKHealthStore()

Y a continuación podemos solicitar la autorización del usuario:

self.healthStore.requestAuthorizationToShareTypes(typesToShare as Set, typesToRead: readDataType as Set, completion: { (success: Bool, error: NSError!) -> Void in
       println("Success: \(success)")
       println("Error: \(error)")
   })

typesToShare es un NSSet que contendrá los datos que queremos grabar en HealthKit, mientras que typesToRead es un NSSet que contendrá la información que queremos leer.

Si por ejemplo lo que queremos es acceder a un dato fijo (HKCharacteristicType, datos que previamente ha tenido que almacenar el usuario en Health app) como es el grupo sanguíneo, creamos un NSSet a partir de un HKCharacteristicType, con el identificador correspondiente al grupo sanguíneo, HKCharacteristicTypeIdentifierBloodType:

let bloodCharacteristicType: HKCharacteristicType = HKObjectType.characteristicTypeForIdentifier("HKCharacteristicTypeIdentifierBloodType")
var typesToRead: NSMutableSet = NSMutableSet(object: bloodCharacteristicType)

Si además queremos obtener la fecha de nacimiento del usuario, el NSSet typesToRead tendrá adicionalmente:

let dateOfBirthCharacteristicType: HKCharacteristicType = HKObjectType.characteristicTypeForIdentifier("HKCharacteristicTypeIdentifierDateOfBirth")
typesToRead.addObject(dateOfBirthCharacteristicType)

Una vez que el usuario ha dado su autorización, podemos interactuar con HealthKit. Para leer el grupo sanguíneo:

let error: NSError?
let bloodType: HKBloodTypeObject = self.healthStore.bloodTypeWithError(&error)!

Del objeto HKBloodTypeObject que obtenemos, nos interesa la propiedad bloodType, que será de los tipos:
HKBloodTypeNotSet, HKBloodTypeAPositive, HKBloodTypeANegative, HKBloodTypeBPositive, HKBloodTypeBNegative, HKBloodTypeABPositive, HKBloodTypeABNegative, HKBloodTypeOPositive o HKBloodTypeONegative.

Para obtener la fecha de nacimiento:

let error: NSError?
let dateOfBirth: NSDate = self.healthStore.dateOfBirthWithError(&error)!

Si nos interesa obtener datos como la masa corporal, la altura o las pulsaciones del usuario, debemos de seguir completando el NSSet typesToShare, para pedir la autorización:

let bodyMassQuantityType: HKQuantityType = HKObjectType.quantityTypeForIdentifier("HKQuantityTypeIdentifierBodyMass")
let heightQuantityType: HKQuantityType = HKObjectType.quantityTypeForIdentifier("HKQuantityTypeIdentifierHeight")
let heartRateQuantityType: HKQuantityType = HKObjectType.quantityTypeForIdentifier("HKQuantityTypeIdentifierHeartRate")
typesToRead.addObjectsFromArray([bodyMassQuantityType, heightQuantityType, heartRateQuantityType])

Tenemos varias opciones a la hora de recoger este tipo de datos de cantidad, pero en este caso vamos a obtener el dato más reciente de todos los almacenados, para lo cual será necesario hacer una consulta a HealthKit para obtener el dato más actual:

let quantityType = HKObjectType.quantityTypeForIdentifier(HKQuantityTypeIdentifierBodyMass)
    let timeSortDescriptor = NSSortDescriptor(key: HKSampleSortIdentifierEndDate, ascending: false)
    let query = HKSampleQuery(sampleType: quantityType, predicate: nil, limit: 1, sortDescriptors: [timeSortDescriptor]) { (query, results, error) -> Void in
       var quantitySample: HKQuantitySample = NSArray(array: results).firstObject as! HKQuantitySample
       var quantity: HKQuantity = quantitySample.quantity
    }
    self.healthStore.executeQuery(query) 

Una vez obtenida la cantidad podemos mostrarla en las unidades que mejor se adapten a nuestras necesidades.

Aquí os mostramos un listado de las unidades del Sistema Internacional disponibles:

Unit string Name Type
«g» Grams Mass
«m» Meters Length
L» or «l» Liters Volume
«Pa» Pascals Pressure
«s» Seconds Time
«J» Joules Energy
«K» Kelvin Temperature
«S» Siemens Electrical conductance
«mol» molar mass Moles Mass

Cada una de las unidades puede ser usada con prefijos o usar otro tipo de unidades.

Para más información: https://developer.apple.com/library/ios/documentation/HealthKit/Reference/HKUnit_Class/index.html#//apple_ref/occ/clm/HKUnit/unitFromString:

Estos son sólo algunos consejos para empezar a usar HealthKit, pero las posibilidades son enormes, tanto de lectura de datos, representación de distintas gráficas, resumenes, como de escritura de datos para compartir información entre aplicaciones.

Además en Solid GEAR hemos desarrollado un módulo complejo e independiente. Con este módulo y junto con un plist donde añadimos los datos que queremos leer y escribir, así como las unidades en las que queremos obtener los valores; somos capaces de usar HealthKit de una forma sencilla y rápida en cualquiera de nuestras aplicaciones.

¡Os animamos a que uséis el framework Healthkit de Apple vitaminando vuestras aplicaciones!

Deja un comentario

¿Necesitas una estimación?

Calcula ahora