HealthKit en Xamarin.iOS

El Kit de mantenimiento proporciona un almacén de datos seguro para la información relacionada con el estado del usuario. Las aplicaciones del Kit de mantenimiento pueden, con el permiso explícito del usuario, leer y escribir en este almacén de datos y recibir notificaciones cuando se agregan los datos pertinentes. Las aplicaciones pueden presentar los datos o los usuarios pueden usar la aplicación Health proporcionada por Apple para ver un panel de todos sus datos.

Dado que los datos relacionados con la salud son tan confidenciales y cruciales, el Kit de mantenimiento está fuertemente relacionado con las unidades de medida y una asociación explícita con el tipo de información que se registra (por ejemplo, el nivel de sangre o la frecuencia del corazón). Además, las aplicaciones del Kit de mantenimiento deben usar derechos explícitos, deben solicitar acceso a los tipos concretos de información y el usuario debe conceder explícitamente a la aplicación acceso a esos tipos de datos.

En este artículo se presentará lo siguiente:

  • Requisitos de seguridad del Kit de mantenimiento, incluido el aprovisionamiento de aplicaciones y la solicitud de permiso de usuario para acceder a la base de datos del Kit de mantenimiento.
  • Sistema de tipos del kit de mantenimiento, que minimiza la posibilidad de aplicar o malinterpretar datos;
  • Escribir en el almacén de datos compartido del Kit de mantenimiento de todo el sistema.

En este artículo no se tratarán temas más avanzados, como consultar la base de datos, convertir entre unidades de medida o recibir notificaciones de nuevos datos.

En este artículo, vamos a crear una aplicación de ejemplo para registrar la frecuencia del usuario:

Una aplicación de ejemplo para registrar la frecuencia del corazón de los usuarios

Requisitos

Para completar los pasos presentados en este artículo, es necesario lo siguiente:

  • Xcode 7 e iOS 8 (o superior): las API Xcode e iOS más recientes de Apple deben instalarse y configurarse en el equipo del desarrollador.
  • Visual Studio para Mac o Visual Studio: la versión más reciente de Visual Studio para Mac debe instalarse y configurarse en el equipo del desarrollador.
  • Dispositivo iOS 8 (o superior): un dispositivo iOS que ejecuta la versión más reciente de iOS 8 o posterior para pruebas.

Importante

Health Kit se introdujo en iOS 8. Actualmente, el Kit de mantenimiento no está disponible en el simulador de iOS y la depuración requiere conexión a un dispositivo iOS físico.

Creación y aprovisionamiento de una aplicación de Kit de mantenimiento

Para que una aplicación de Xamarin iOS 8 pueda usar la API de HealthKit, debe configurarse y aprovisionarse correctamente. En esta sección se tratarán los pasos necesarios para configurar correctamente la aplicación xamarin.

Las aplicaciones del Kit de mantenimiento requieren:

  • Identificador de aplicación explícito.
  • Un perfil de aprovisionamiento asociado a ese identificador de aplicación explícito y con permisos del Kit de mantenimiento.
  • con Entitlements.plist una propiedad de tipo establecida en com.apple.developer.healthkitBooleanYes .
  • cuya Info.plistUIRequiredDeviceCapabilities clave contiene una entrada con el String valor healthkit .
  • también debe tener entradas de explicación de privacidad adecuadas: una explicación de la clave si la aplicación va a escribir datos y una explicación de la clave si la aplicación va a leer los datos del Info.plistString Kit de NSHealthUpdateUsageDescriptionStringNSHealthShareUsageDescription mantenimiento.

Para obtener más información sobre el aprovisionamiento de una aplicación iOS, en el artículo Aprovisionamiento de dispositivos de la serie Tareas iniciales de Xamarin se describe la relación entre los certificados de desarrollador, los ids de la aplicación, los perfiles de aprovisionamiento y los derechos de aplicación.

Id. de aplicación explícito y perfil de aprovisionamiento

La creación de un identificador de aplicación explícito y un perfil de aprovisionamiento adecuado se realiza en el dispositivo iOS deApple Centro de desarrollo .

Los identificadores de aplicación actuales se muestran en la sección Certificates, Identifiers Profiles (Certificados, perfiles de identificadores) de la Centro de desarrollo. A menudo, esta lista mostrará los valores de identificador de , lo que indica que el nombre del identificador de aplicación se puede usar con cualquier número de sufijos. Estos iDs de aplicación con caracteres comodín no se pueden usar con el Kit de mantenimiento.

Para crear un identificador de aplicación explícito,haga clic en el botón de la esquina superior derecha para ir a la página Registrar id. de aplicación de iOS:

Registro de una aplicación en apple Portal para desarrolladores

Como se muestra en la imagen anterior, después de crear una descripción de la aplicación, use la sección Id. de aplicación explícita para crear un identificador para la aplicación. En la App Services, active el Kit de mantenimiento en la sección Habilitar servicios.

Cuando haya terminado, presione el botón Continuar para registrar el identificador de aplicación en su cuenta. Volverá a la página Certificados, identificadores y perfiles. Haga clic en Perfiles de aprovisionamiento para ir a la lista de perfiles de aprovisionamiento actuales y haga clic en el botón de la esquina superior derecha para ir a la página Agregar perfil de aprovisionamiento de iOS. Seleccione la opción Desarrollo de aplicaciones iOS y haga clic en Continuar para ir a la página Seleccionar id. de aplicación. Aquí, seleccione el identificador de aplicación explícito que especificó anteriormente:

Seleccione el identificador de aplicación explícito.

Haga clic en Continuar y trabaje en las pantallas restantes, donde especificará los certificados de desarrollador, los dispositivos yun nombre para este perfil de aprovisionamiento:

Generar el perfil de aprovisionamiento

Haga clic en Generar y espere la creación del perfil. Descargue el archivo y haga doble clic en él para instalarlo en Xcode. Puede confirmar que se instala en Preferencias de Xcode Cuentas Ver >> detalles... Debería ver el perfil de aprovisionamiento que acaba de instalar y debe tener el icono del Kit de mantenimiento y cualquier otro servicio especial en su >

Visualización del perfil en Xcode

Asociación del identificador de aplicación y el perfil de aprovisionamiento a la aplicación xamarin.iOS

Una vez que haya creado e instalado un perfil de aprovisionamiento adecuado como se describe, normalmente sería el momento de crear una solución en Visual Studio para Mac o Visual Studio. El acceso al Kit de mantenimiento está disponible para cualquier proyecto de C# o F# de iOS.

En lugar de recorrer el proceso de creación de un proyecto de Xamarin iOS 8 a mano, abra la aplicación de ejemplo adjunta a este artículo (que incluye un guión gráfico precompilado y código). Para asociar la aplicación de ejemplo con el perfil de aprovisionamiento habilitado para el Kit de mantenimiento ,en el Panel de solución ,haga clic con el botón derecho en el Project y muestre el cuadro de diálogo Opciones. Cambie al panel Aplicación de iOS y escriba el identificador de aplicación explícito que creó anteriormente como identificador de lote de la aplicación:

Escriba el identificador de aplicación explícito.

Ahora cambie al panel Firma de lotes de iOS. El perfil de aprovisionamiento instalado recientemente,con su asociación al identificador de aplicación explícito,ahora estará disponible como perfil de aprovisionamiento:

Selección del perfil de aprovisionamiento

Si el perfil de aprovisionamiento no está disponible, compruebe el identificador de agrupación en el panel aplicación de iOS frente al especificado en iOS Centro de desarrollo y que el perfil de aprovisionamiento está instalado (Detalles de la vista de cuentas de preferencias de Xcode... ).

Cuando el perfil de aprovisionamiento habilitado para el kit de mantenimiento esté seleccionado, haga clic en Aceptar para cerrar el cuadro de Project opciones.

Valores entitlements.plist e Info.plist

La aplicación de ejemplo incluye un archivo (que es necesario para las aplicaciones habilitadas para el Kit de mantenimiento) y no se incluye en todas Entitlements.plist las Project plantilla. Si el proyecto no incluye derechos, haga clic con el botón derecho en el proyecto, elija Archivo nuevo archivo... > Derechos de > iOS.plist para agregar uno manualmente.

En última instancia, Entitlements.plist debe tener el siguiente par clave-valor:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
    <key>com.apple.developer.HealthKit</key>
    <true/>
</dict>
</plist>

De forma similar, Info.plist para la aplicación debe tener un valor de asociado a la healthkitUIRequiredDeviceCapabilities clave:

<key>UIRequiredDeviceCapabilities</key>
<array>
<string>armv7</string>
    <string>healthkit</string>
</array>

La aplicación de ejemplo proporcionada con este artículo incluye un Entitlements.plist preconfigurado que incluye todas las claves necesarias.

Kit de mantenimiento de programación

El almacén de datos del Kit de mantenimiento es un almacén de datos privado específico del usuario que se comparte entre las aplicaciones. Dado que la información de mantenimiento es tan confidencial, el usuario debe tomar medidas positivas para permitir el acceso a los datos. Este acceso puede ser parcial (escritura pero no lectura, acceso para algunos tipos de datos, pero no para otros, etc.). y se pueden revocar en cualquier momento. Las aplicaciones del Kit de mantenimiento deben escribirse de forma defensiva, con el conocimiento de que muchos usuarios dudarán sobre el almacenamiento de su información relacionada con el estado.

Los datos del Kit de mantenimiento se limitan a los tipos especificados de Apple. Estos tipos están estrictamente definidos: algunos, como el tipo de sangre, se limitan a los valores concretos de una enumeración proporcionada por Apple, mientras que otros combinan una magnitud con una unidad de medida (como los gramas, las bebidas y los alimentos). Incluso los datos que comparten una unidad de medida compatible se distinguen por su ; por ejemplo, el sistema de tipos detectará un intento erróneo de almacenar un valor en un campo que espera , aunque ambos usen la unidad de HKObjectTypeHKQuantityTypeIdentifier.NumberOfTimesFallenHKQuantityTypeIdentifier.FlightsClimbedHKUnit.Count medida.

Los tipos que se pueden storable en el almacén de datos del Kit de mantenimiento son todas las subclases de HKObjectType . HKCharacteristicType Los objetos almacenan el sexo insó hay, el tipo de sangre y la fecha de nacimiento. Sin embargo, son objetos más comunes, que representan los datos muestreados HKSampleType en un momento específico o durante un período de tiempo.

Gráfico de objetos HKSampleType

HKSampleType es abstracto y tiene cuatro subclases concretas. Actualmente solo hay un tipo de HKCategoryType datos, que es Análisis de suspensión. La gran mayoría de los datos del Kit de mantenimiento son de tipo y almacenan sus datos en objetos, que se crean con el HKQuantityType conocido patrón de diseño HKQuantitySample factory:

La gran mayoría de los datos del Kit de mantenimiento son de tipo HKQuantityType y almacenan sus datos en objetos HKQuantitySample.

HKQuantityType Los tipos van de HKQuantityTypeIdentifier.ActiveEnergyBurned a HKQuantityTypeIdentifier.StepCount .

Solicitar permiso al usuario

Los usuarios finales deben realizar pasos positivos para permitir que una aplicación lea o escriba datos del Kit de mantenimiento. Esto se realiza a través de la aplicación De mantenimiento que viene preinstalada en dispositivos iOS 8. La primera vez que se ejecuta una aplicación del Kit de mantenimiento, se muestra al usuario un cuadro de diálogo de acceso de estado controlado por el sistema:

Se muestra al usuario un cuadro de diálogo de acceso de estado controlado por el sistema.

Más adelante, el usuario puede cambiar los permisos mediante el cuadro de diálogo Orígenes de la aplicación de mantenimiento:

El usuario puede cambiar los permisos mediante el cuadro de diálogo Orígenes de aplicaciones de mantenimiento

Dado que la información de mantenimiento es extremadamente confidencial, los desarrolladores de aplicaciones deben escribir sus programas de forma defensiva, con la expectativa de que los permisos se rechazarán y cambiarán mientras se ejecuta la aplicación. La expresión más común es solicitar permisos en el método y, a UIApplicationDelegate.OnActivated continuación, modificar la interfaz de usuario según corresponda.

Tutorial de permisos

En el proyecto aprovisionado por el Kit de mantenimiento, abra el AppDelegate.cs archivo . Observe la instrucción mediante HealthKit ; en la parte superior del archivo.

El código siguiente está relacionado con los permisos del Kit de mantenimiento:

private HKHealthStore healthKitStore = new HKHealthStore ();

public override void OnActivated (UIApplication application)
{
        ValidateAuthorization ();
}

private void ValidateAuthorization ()
{
        var heartRateId = HKQuantityTypeIdentifierKey.HeartRate;
        var heartRateType = HKObjectType.GetQuantityType (heartRateId);
        var typesToWrite = new NSSet (new [] { heartRateType });
        var typesToRead = new NSSet ();
        healthKitStore.RequestAuthorizationToShare (
                typesToWrite, 
                typesToRead, 
                ReactToHealthCarePermissions);
}

void ReactToHealthCarePermissions (bool success, NSError error)
{
        var access = healthKitStore.GetAuthorizationStatus (HKObjectType.GetQuantityType (HKQuantityTypeIdentifierKey.HeartRate));
        if (access.HasFlag (HKAuthorizationStatus.SharingAuthorized)) {
                HeartRateModel.Instance.Enabled = true;
        } else {
                HeartRateModel.Instance.Enabled = false;
        }
}

Todo el código de estos métodos podría realizarse en línea en , pero la aplicación de ejemplo usa métodos independientes para que su intención sea más clara: tiene los pasos necesarios para solicitar acceso a los tipos específicos que se OnActivated escriben (y leer, si la aplicación lo desea) y es una devolución de llamada que se activa después de que el usuario haya interactuado con el cuadro de diálogo de permisos en ValidateAuthorization()ReactToHealthCarePermissions() el Health.app.

El trabajo de es compilar el conjunto de que la aplicación escribirá y solicitará ValidateAuthorization() autorización para actualizar los HKObjectTypes datos. En la aplicación de ejemplo, HKObjectType es para la clave KHQuantityTypeIdentifierKey.HeartRate . Este tipo se agrega al conjunto typesToWrite , mientras que el conjunto se deja typesToRead vacío. Estos conjuntos, y una referencia a la ReactToHealthCarePermissions() devolución de llamada, se pasan a HKHealthStore.RequestAuthorizationToShare() .

Se llamará a la devolución de llamada después de que el usuario haya interactuado con el cuadro de diálogo de permisos y se le pasen dos fragmentos de información: un valor que será si el usuario ha interactuado con el cuadro de diálogo de permisos y un que, si no es NULL, indica algún tipo de error asociado a la presentación del cuadro de diálogo ReactToHealthCarePermissions()bool de trueNSError permisos.

Importante

Para tener claros los argumentos de esta función: los parámetros correctos y de error no indican si el usuario ha concedido permiso para acceder a los datos del Kit de mantenimiento. Solo indican que el usuario tiene la oportunidad de permitir el acceso a los datos.

Para confirmar si la aplicación tiene acceso a los datos, se HKHealthStore.GetAuthorizationStatus() usa , pasando HKQuantityTypeIdentifierKey.HeartRate . En función del estado devuelto, la aplicación habilita o deshabilita la capacidad de escribir datos. No hay ninguna experiencia de usuario estándar para tratar con una denegación de acceso y hay muchas opciones posibles. En la aplicación de ejemplo, el estado se establece en un objeto singleton que, a su HeartRateModel vez, genera eventos pertinentes.

Modelo, vista y controlador

Para revisar el HeartRateModel objeto singleton, abra el HeartRateModel.cs archivo :

using System;
using HealthKit;
using Foundation;

namespace HKWork
{
        public class GenericEventArgs<T> : EventArgs
        {
                public T Value { get; protected set; }
                public DateTime Time { get; protected set; }

                public GenericEventArgs (T value)
                {
                        this.Value = value;
                        Time = DateTime.Now;
                }
        }

        public delegate void GenericEventHandler<T> (object sender,GenericEventArgs<T> args);

        public sealed class HeartRateModel : NSObject
        {
                private static volatile HeartRateModel singleton;
                private static object syncRoot = new Object ();

                private HeartRateModel ()
                {
                }

                public static HeartRateModel Instance {
                        get {
                                //Double-check lazy initialization
                                if (singleton == null) {
                                        lock (syncRoot) {
                                                if (singleton == null) {
                                                        singleton = new HeartRateModel ();
                                                }
                                        }
                                }

                                return singleton;
                        }
                }

                private bool enabled = false;

                public event GenericEventHandler<bool> EnabledChanged;
                public event GenericEventHandler<String> ErrorMessageChanged;
                public event GenericEventHandler<Double> HeartRateStored;

                public bool Enabled { 
                        get { return enabled; }
                        set {
                                if (enabled != value) {
                                        enabled = value;
                                        InvokeOnMainThread(() => EnabledChanged (this, new GenericEventArgs<bool>(value)));
                                }
                        }
                }

                public void PermissionsError(string msg)
                {
                        Enabled = false;
                        InvokeOnMainThread(() => ErrorMessageChanged (this, new GenericEventArgs<string>(msg)));
                }

                //Converts its argument into a strongly-typed quantity representing the value in beats-per-minute
                public HKQuantity HeartRateInBeatsPerMinute(ushort beatsPerMinute)
                {
                        var heartRateUnitType = HKUnit.Count.UnitDividedBy (HKUnit.Minute);
                        var quantity = HKQuantity.FromQuantity (heartRateUnitType, beatsPerMinute);

                        return quantity;
                }
                        
                public void StoreHeartRate(HKQuantity quantity)
                {
                        var bpm = HKUnit.Count.UnitDividedBy (HKUnit.Minute);
                        //Confirm that the value passed in is of a valid type (can be converted to beats-per-minute)
                        if (! quantity.IsCompatible(bpm))
                        {
                                InvokeOnMainThread(() => ErrorMessageChanged(this, new GenericEventArgs<string> ("Units must be compatible with BPM")));
                        }

                        var heartRateId = HKQuantityTypeIdentifierKey.HeartRate;
                        var heartRateQuantityType = HKQuantityType.GetQuantityType (heartRateId);
                        var heartRateSample = HKQuantitySample.FromType (heartRateQuantityType, quantity, new NSDate (), new NSDate (), new HKMetadata());

                        using (var healthKitStore = new HKHealthStore ()) {
                                healthKitStore.SaveObject (heartRateSample, (success, error) => {
                                        InvokeOnMainThread (() => {
                                                if (success) {
                                                        HeartRateStored(this, new GenericEventArgs<Double>(quantity.GetDoubleValue(bpm)));
                                                } else {
                                                        ErrorMessageChanged(this, new GenericEventArgs<string>("Save failed"));
                                                }
                                                if (error != null) {
                                                        //If there's some kind of error, disable 
                                                        Enabled = false;
                                                        ErrorMessageChanged (this, new GenericEventArgs<string>(error.ToString()));
                                                }
                                        });
                                });
                        }
                }
        }
}

La primera sección es código reutilizable para crear controladores y eventos genéricos. La parte inicial de la HeartRateModel clase también es reutilizable para crear un objeto singleton seguro para subprocesos.

A HeartRateModel continuación, expone 3 eventos:

  • EnabledChanged : indica que se ha habilitado o deshabilitado el almacenamiento de frecuencias ritmos (tenga en cuenta que el almacenamiento está deshabilitado inicialmente).
  • ErrorMessageChanged - Para esta aplicación de ejemplo, tenemos un modelo de control de errores muy sencillo: una cadena con el último error .
  • HeartRateStored - Se genera cuando se almacena una frecuencia heart rate en la base de datos del Kit de mantenimiento.

Tenga en cuenta que cada vez que se desencadenan estos eventos, se realiza a través de , lo que permite a NSObject.InvokeOnMainThread() los suscriptores actualizar la interfaz de usuario. Como alternativa, los eventos se podrían documentar como que se están generando en subprocesos en segundo plano y la responsabilidad de garantizar la compatibilidad podría desasistido a sus controladores. Las consideraciones sobre subprocesos son importantes en las aplicaciones del Kit de mantenimiento porque muchas de las funciones, como la solicitud de permiso, son asincrónicas y ejecutan sus devoluciones de llamada en subprocesos no principales.

El código específico del Kit de Estado de HeartRateModel está en las dos funciones y HeartRateInBeatsPerMinute()StoreHeartRate() .

HeartRateInBeatsPerMinute() convierte su argumento en un kit de mantenimiento fuertemente tipo HKQuantity . El tipo de la cantidad es el especificado por y las unidades de la cantidad se dividen HKQuantityTypeIdentifierKey.HeartRateHKUnit.Count entre HKUnit.Minute (es decir, la unidad se supera HKQuantityTypeIdentifierKey.HeartRate

La StoreHeartRate() función toma un HKQuantity (en la aplicación de ejemplo, uno creado por HeartRateInBeatsPerMinute() ). Para validar sus datos, usa el método , que devuelve si las unidades del objeto se pueden convertir en las HKQuantity.IsCompatible()true unidades del argumento . Si la cantidad se creó con esto obviamente devolverá , pero también devolvería si la cantidad se creara como, por HeartRateInBeatsPerMinute()truetrue ejemplo, HeartRateInBeatsPerMinute() Más comúnmente, se puede usar para validar la masa, la distancia y la energía que el usuario o un dispositivo podrían introducir o mostrar en un sistema de medida (por ejemplo, unidades de Proceso), pero que podrían almacenarse en otro sistema (por ejemplo, unidades HKQuantity.IsCompatible() métricas).

Una vez validada la compatibilidad de la cantidad, el método de generador se usa para crear un objeto HKQuantitySample.FromType() fuertemente heartRateSample tipo. HKSample Los objetos tienen una fecha de inicio y finalización; para lecturas instantáneas, estos valores deben ser los mismos, como en el ejemplo. El ejemplo tampoco establece ningún dato clave-valor en su argumento, pero se podría usar código como el siguiente para HKMetadata especificar la ubicación del sensor:

var hkm = new HKMetadata();
hkm.HeartRateSensorLocation = HKHeartRateSensorLocation.Chest;

Una vez creado, el código crea una nueva conexión a la base heartRateSample de datos con el bloque using. Dentro de ese bloque, el HKHealthStore.SaveObject() método intenta la escritura asincrónica en la base de datos. La llamada resultante a la expresión lambda desencadena eventos relevantes, HeartRateStored o ErrorMessageChanged .

Ahora que se ha programado el modelo, es el momento de ver cómo refleja el controlador el estado del modelo. Abra el archivo HKWorkViewController.cs. El constructor simplemente une el singleton a los métodos de control de eventos (de nuevo, esto se podría hacer en línea con expresiones lambda, pero los métodos independientes hacen que la intención sea un poco HeartRateModel más obvia):

public HKWorkViewController (IntPtr handle) : base (handle)
{
     HeartRateModel.Instance.EnabledChanged += OnEnabledChanged;
     HeartRateModel.Instance.ErrorMessageChanged += OnErrorMessageChanged;
     HeartRateModel.Instance.HeartRateStored += OnHeartBeatStored;
}

Estos son los controladores pertinentes:

void OnEnabledChanged (object sender, GenericEventArgs<bool> args)
{
        StoreData.Enabled = args.Value;
        PermissionsLabel.Text = args.Value ? "Ready to record" : "Not authorized to store data.";
        PermissionsLabel.SizeToFit ();
}

void OnErrorMessageChanged (object sender, GenericEventArgs<string> args)
{
        PermissionsLabel.Text = args.Value;
}

void OnHeartBeatStored (object sender, GenericEventArgs<double> args)
{
        PermissionsLabel.Text = String.Format ("Stored {0} BPM", args.Value);
}

Obviamente, en una aplicación con un solo controlador, sería posible evitar la creación de un objeto de modelo independiente y el uso de eventos para el flujo de control, pero el uso de objetos de modelo es más adecuado para las aplicaciones del mundo real.

Ejecución de la aplicación de ejemplo

El simulador de iOS no admite el Kit de mantenimiento. La depuración debe realizarse en un dispositivo físico que ejecute iOS 8.

Conecte un dispositivo de desarrollo de iOS 8 aprovisionado correctamente al sistema. Selecciónelo como destino de implementación en Visual Studio para Mac y, en el menú, elija Ejecutar depuración.

Importante

Los errores relacionados con el aprovisionamiento aparecerán en este momento. Para solucionar errores, revise la sección anterior Creación y aprovisionamiento de una aplicación de Kit de mantenimiento. Los componentes son:

  • iOS Centro de desarrollo: identificador de aplicación explícito Perfil de aprovisionamiento habilitado del Kit de mantenimiento.
  • Project opciones: identificador de lote (id. de aplicación explícito) Perfil de aprovisionamiento.
  • Código fuente: Entitlements.plist Info.plist

Suponiendo que las provisiones se hayan establecido correctamente, se iniciará la aplicación. Cuando llegue a su OnActivated método, solicitará la autorización del Kit de mantenimiento. La primera vez que el sistema operativo lo encuentre, se mostrará al usuario el siguiente cuadro de diálogo:

El usuario aparecerá con este cuadro de diálogo.

Habilite la aplicación para actualizar los datos de frecuencia heart rate y la aplicación volverá a aparecer. La ReactToHealthCarePermissions devolución de llamada se activará de forma asincrónica. Esto hará que la propiedad cambie, lo que provocará el evento , lo que hará que se ejecute el controlador de eventos, lo que HeartRateModel’sEnabled habilita el botón EnabledChangedHKPermissionsViewController.OnEnabledChanged()StoreData . En el diagrama siguiente se muestra la secuencia:

En este diagrama se muestra la secuencia de eventos

Presione el botón Grabar. Esto hará que se ejecute el controlador, que intentará analizar el valor del campo de texto, convertirlo en a través de la función analizada anteriormente y pasar esa StoreData_TouchUpInside()heartRate cantidad a HKQuantityHeartRateModel.HeartRateInBeatsPerMinute()HeartRateModel.StoreHeartRate() . Como se ha comentado anteriormente, esto intentará almacenar los datos y dará lugar a un HeartRateStored evento ErrorMessageChanged o .

Haga doble clic en el botón Inicio del dispositivo y abra la aplicación De mantenimiento. Haga clic en la pestaña Orígenes y verá la aplicación de ejemplo en la lista. Elíbalo y no permite el permiso para actualizar los datos de frecuencia del corazón. Haga doble clic en el botón Inicio y vuelva a la aplicación. Una vez más, se llamará a , pero esta vez, dado que se deniega el acceso, el botón StoreData se deshabilitará (tenga en cuenta que esto se produce de forma asincrónica y que el cambio en la interfaz de usuario puede ser visible para el usuario ReactToHealthCarePermissions() final). ReactToHealthCarePermissions()

Temas avanzados

Leer datos de la base de datos del Kit de mantenimiento es muy similar a escribir datos: uno especifica los tipos de datos a los que se intenta acceder, solicita autorización y, si se concede esa autorización, los datos están disponibles, con conversión automática a unidades de medida compatibles.

Hay una serie de funciones de consulta más sofisticadas que permiten consultas basadas en predicados y consultas que realizan actualizaciones cuando se actualizan los datos pertinentes.

Los desarrolladores de aplicaciones de Health Kit deben revisar la sección Health Kit de las directrices de revisión de aplicaciones deApple.

Una vez que se entienden los modelos de seguridad y del sistema de tipos, el almacenamiento y la lectura de datos en la base de datos del Kit de mantenimiento compartido es bastante sencillo. Muchas de las funciones del Kit de mantenimiento funcionan de forma asincrónica y los desarrolladores de aplicaciones deben escribir sus programas correctamente.

En el momento de redactar este artículo, actualmente no hay ningún equivalente a Health Kit en Android o Windows Phone.

Resumen

En este artículo hemos visto cómo el Kit de mantenimiento permite que las aplicaciones almacenen, recuperen y compartan información relacionada con el estado, al tiempo que proporciona una aplicación de mantenimiento estándar que permite al usuario acceder a estos datos y controlarlos.

También hemos visto cómo la privacidad, la seguridad y la integridad de los datos invalidan las preocupaciones de la información relacionada con el estado y las aplicaciones que usan el Kit de mantenimiento deben abordar el aumento de la complejidad en los aspectos de administración de aplicaciones (aprovisionamiento), la codificación (sistema de tipos del Kit de mantenimiento) y la experiencia del usuario (control de permisos por parte del usuario a través de diálogos del sistema y la aplicación de mantenimiento).

Por último, hemos visto una implementación sencilla del Kit de mantenimiento mediante la aplicación de ejemplo incluida que escribe datos de latido en el almacén del Kit de mantenimiento y tiene un diseño con conocimiento asincrónico.