HomeKit en Xamarin.iOS

HomeKit es el marco de Apple para controlar los dispositivos de automatización doméstica. En este artículo se presenta HomeKit y se trata la configuración de accesorios de prueba en el simulador de accesorios HomeKit y la escritura de una sencilla aplicación de Xamarin.iOS para interactuar con estos accesorios.

An example HomeKit enabled App

Apple introdujo HomeKit en iOS 8 como una manera de integrar sin problemas varios dispositivos de automatización doméstica de varios proveedores en una sola unidad coherente. Al promover un protocolo común para detectar, configurar y controlar dispositivos de automatización doméstica, HomeKit permite que los dispositivos de proveedores no relacionados funcionen juntos, todo sin que los proveedores individuales tengan que coordinar los esfuerzos.

Con HomeKit, puede crear una aplicación de Xamarin.iOS que controle cualquier dispositivo habilitado para HomeKit sin usar las API o aplicaciones proporcionadas por el proveedor. Con HomeKit, puede hacer lo siguiente:

  • Descubra los nuevos dispositivos homeKit habilitados para la automatización del hogar y agréguelos a una base de datos que se conservará en todos los dispositivos iOS del usuario.
  • Configure, configure, muestre y controle cualquier dispositivo en la base de datos de configuración principal de HomeKit.
  • Comunicarse con cualquier dispositivo HomeKit preconfigurado y comandarlos para realizar acciones individuales o trabajar en concierto, como encender todas las luces de la cocina.

Además de servir dispositivos en la base de datos de configuración principal a las aplicaciones habilitadas para HomeKit, HomeKit proporciona acceso a los comandos de voz de Siri. Dada una configuración de HomeKit configurada adecuadamente, el usuario puede emitir comandos de voz como "Siri, encender las luces en la sala de estar".

Base de datos de configuración principal

HomeKit organiza todos los dispositivos de automatización en una ubicación determinada en una colección principal. Esta colección proporciona una manera para que el usuario agrupe sus dispositivos de automatización doméstica en unidades organizadas lógicamente con etiquetas significativas y legibles.

La colección principal se almacena en una base de datos de configuración principal que se realizará automáticamente una copia de seguridad y se sincronizará en todos los dispositivos iOS del usuario. HomeKit proporciona las siguientes clases para trabajar con la base de datos de configuración principal:

  • HMHome - Este es el contenedor de nivel superior que contiene toda la información y las configuraciones de todos los dispositivos de automatización doméstica en una sola ubicación física (por ejemplo, una residencia familiar única). Es posible que el usuario tenga más de una residencia, como su casa principal y una casa de vacaciones. O pueden tener diferentes "casas" en la misma propiedad, como la casa principal y una casa de huéspedes sobre el garaje. En cualquier caso, al menos un HMHome objeto debe configurarse y almacenarse antes de que se pueda escribir cualquier otra información de HomeKit.
  • HMRoom - Aunque opcional, un HMRoom permite al usuario definir habitaciones específicas dentro de una casa (HMHome) como: Cocina, Baño, Garaje o Sala de Estar. El usuario puede agrupar todos los dispositivos de automatización doméstica en una ubicación específica de su casa en y HMRoom actuar sobre ellos como una unidad. Por ejemplo, pedir a Siri que apague las luces del garaje.
  • HMAccessory : representa un dispositivo de automatización habilitado para HomeKit físico individual que se ha instalado en la residencia del usuario (por ejemplo, un termostato inteligente). Cada HMAccessory uno de ellos se asigna a .HMRoom Si el usuario no ha configurado ninguna sala, HomeKit asigna accesorios a una sala predeterminada especial.
  • HMService - Representa un servicio proporcionado por un determinado HMAccessory, como el estado de encendido y apagado de una luz o su color (si se admite el cambio de color). Cada HMAccessory uno puede tener más de un servicio, como un abiertor de puerta de garaje que también incluye una luz. Además, un determinado HMAccessory podría tener servicios, como la actualización de firmware, que están fuera del control de usuario.
  • HMZone - Permite al usuario agrupar una colección de HMRoom objetos en zonas lógicas, como Arriba, Abajo o Sótano. Aunque es opcional, esto permite interacciones como pedir a Siri que desactive toda la luz abajo.

Aprovisionamiento de una aplicación HomeKit

Debido a los requisitos de seguridad impuestos por HomeKit, una aplicación de Xamarin.iOS que usa el marco HomeKit debe configurarse correctamente en el Portal para desarrolladores de Apple y en el archivo de proyecto de Xamarin.iOS.

Haga lo siguiente:

  1. Inicie sesión en el Portal para desarrolladores de Apple.

  2. Haga clic en Certificados, Identificadores y Perfiles.

  3. Si aún no lo ha hecho, haga clic en Identificadores y cree un identificador para la aplicación (por ejemplo com.company.appname, ), edite el identificador existente.

  4. Asegúrese de que el servicio HomeKit se ha comprobado para el identificador especificado:

    Enable the HomeKit service for the given ID

  5. Guarde los cambios.

  6. Haga clic en Desarrollo de perfiles> de aprovisionamiento y cree un nuevo perfil de aprovisionamiento de desarrollo para la aplicación:

    Create a new development provisioning profile for the app

  7. Descargue e instale el nuevo perfil de aprovisionamiento o use Xcode para descargar e instalar el perfil.

  8. Edite las opciones del proyecto de Xamarin.iOS y asegúrese de que usa el perfil de aprovisionamiento que acaba de crear:

    Select provisioning profile just created

  9. A continuación, edite el archivo Info.plist y asegúrese de que usa el identificador de aplicación que se usó para crear el perfil de aprovisionamiento:

    Set the App ID

  10. Por último, edite el archivo Entitlements.plist y asegúrese de que se ha seleccionado el derecho HomeKit :

    Enable the HomeKit entitlement

  11. Guarde los cambios en todos los archivos.

Con esta configuración en su lugar, la aplicación ya está lista para acceder a las API de HomeKit Framework. Para obtener información detallada sobre el aprovisionamiento, consulte nuestras guías de aprovisionamiento y aprovisionamiento de dispositivos.

Importante

La prueba de una aplicación habilitada para HomeKit requiere un dispositivo iOS real que se ha aprovisionado correctamente para el desarrollo. HomeKit no se puede probar desde el simulador de iOS.

El simulador de accesorios HomeKit

Para proporcionar una manera de probar todos los posibles dispositivos y servicios de automatización doméstica, sin tener que tener un dispositivo físico, Apple creó el simulador de accesorios HomeKit. Con este simulador, puede configurar y configurar dispositivos HomeKit virtuales.

Instalación del simulador

Apple proporciona el simulador de accesorios HomeKit como una descarga independiente de Xcode, por lo que deberá instalarlo antes de continuar.

Haga lo siguiente:

  1. En un explorador web, visite Descargas para desarrolladores de Apple.

  2. Descargue las herramientas adicionales para Xcode xxx (donde xxx es la versión de Xcode que ha instalado):

    Download the Additional Tools for Xcode

  3. Abra la imagen de disco e instale las herramientas en el directorio Aplicaciones .

Con el simulador de accesorios HomeKit instalado, se pueden crear accesorios virtuales para realizar pruebas.

Crear accesorios virtuales

Para iniciar el simulador de accesorios HomeKit y crear algunos accesorios virtuales, haga lo siguiente:

  1. En la carpeta Aplicaciones, inicie el simulador de accesorios HomeKit:

    The HomeKit Accessory Simulator

  2. Haga clic en el + botón y seleccione Nuevo accesorio...:

    Add a new accessory

  3. Rellene la información sobre el nuevo accesorio y haga clic en el botón Finalizar :

    Fill out the information about the new accessory

  4. Haga clic en el botón Agregar servicio.. y seleccione un tipo de servicio en la lista desplegable:

    Select a service type from the dropdown

  5. Proporcione un nombre para el servicio y haga clic en el botón Finalizar :

    Enter a Name for the service

  6. Puede proporcionar características opcionales para un servicio haciendo clic en el botón Agregar característica y configurando los valores necesarios:

    Configuring the required settings

  7. Repita los pasos anteriores para crear uno de cada tipo de dispositivo de automatización de hogar virtual compatible con HomeKit.

Con algunos accesorios homeKit virtuales de ejemplo creados y configurados, ahora puede consumir y controlar estos dispositivos desde la aplicación Xamarin.iOS.

Configuración del archivo Info.plist

Nuevo para iOS 10 (y versiones posteriores), el desarrollador deberá agregar la NSHomeKitUsageDescription clave al archivo de Info.plist la aplicación y proporcionar una cadena que declare por qué la aplicación quiere acceder a la base de datos homeKit del usuario. Esta cadena se presentará al usuario la primera vez que ejecute la aplicación:

The HomeKit permission dialog

Para establecer esta clave, haga lo siguiente:

  1. Haga doble clic en el Info.plist archivo del Explorador de soluciones para abrirlo para su edición.

  2. En la parte inferior de la pantalla, cambie a la vista Origen .

  3. Agregue una nueva entrada a la lista.

  4. En la lista desplegable, seleccione Privacidad - Descripción del uso de HomeKit:

    Select Privacy - HomeKit Usage Description

  5. Escriba una descripción para saber por qué la aplicación quiere acceder a la base de datos HomeKit del usuario:

    Enter a description

  6. Guarde los cambios en el archivo.

Importante

Si no se establece la NSHomeKitUsageDescription clave en el Info.plist archivo, se producirá un error silencioso en la aplicación (cerrado por el sistema en tiempo de ejecución) sin error al ejecutarse en iOS 10 (o superior).

Conectar a HomeKit

Para comunicarse con HomeKit, la aplicación de Xamarin.iOS debe crear primero una instancia de la HMHomeManager clase . Home Manager es el punto de entrada central en HomeKit y es responsable de proporcionar una lista de hogares disponibles, actualizar y mantener esa lista y devolver la casa principal del usuario.

El HMHome objeto contiene toda la información sobre un hogar dado, incluidas las salas, grupos o zonas que puede contener, junto con cualquier accesorios de automatización doméstica que se hayan instalado. Antes de que se puedan realizar operaciones en HomeKit, se debe crear y asignar al menos una HMHome como inicio principal.

La aplicación es responsable de comprobar si existe una casa principal y crearla y asignarla si no lo hace.

Adición de un administrador principal

Para agregar reconocimiento de HomeKit a una aplicación de Xamarin.iOS, edite el archivo AppDelegate.cs para editarlo y fíjelo como el siguiente:

using HomeKit;
...

public HMHomeManager HomeManager { get; set; }
...

public override void FinishedLaunching (UIApplication application)
{
    // Attach to the Home Manager
    HomeManager = new HMHomeManager ();
    Console.WriteLine ("{0} Home(s) defined in the Home Manager", HomeManager.Homes.Count());

    // Wire-up Home Manager Events
    HomeManager.DidAddHome += (sender, e) => {
        Console.WriteLine("Manager Added Home: {0}",e.Home);
    };

    HomeManager.DidRemoveHome += (sender, e) => {
        Console.WriteLine("Manager Removed Home: {0}",e.Home);
    };
    HomeManager.DidUpdateHomes += (sender, e) => {
        Console.WriteLine("Manager Updated Homes");
    };
    HomeManager.DidUpdatePrimaryHome += (sender, e) => {
        Console.WriteLine("Manager Updated Primary Home");
    };
}

Cuando la aplicación se ejecute por primera vez, se le preguntará al usuario si desea permitir que acceda a su información de HomeKit:

The user will be asked if they want to allow it to access their HomeKit information

Si el usuario responde bien, la aplicación podrá trabajar con sus accesorios HomeKit; de lo contrario, no se producirán errores en las llamadas a HomeKit.

Con home Manager implementado, la siguiente aplicación tendrá que ver si se ha configurado una casa principal y, si no es así, proporcionar una manera para que el usuario cree y asigne una.

Acceso a la página principal

Como se indicó anteriormente, se debe crear y configurar una casa principal antes de que HomeKit esté disponible y es responsabilidad de la aplicación proporcionar una manera para que el usuario cree y asigne una casa principal si aún no existe.

Cuando la aplicación se inicia por primera vez o vuelve desde segundo plano, debe supervisar el DidUpdateHomes evento de la HMHomeManager clase para comprobar la existencia de un inicio principal. Si no existe, debe proporcionar una interfaz para que el usuario cree una.

El código siguiente se puede agregar a un controlador de vista para comprobar el inicio principal:

using HomeKit;
...

public AppDelegate ThisApp {
    get { return (AppDelegate)UIApplication.SharedApplication.Delegate; }
}
...

// Wireup events
ThisApp.HomeManager.DidUpdateHomes += (sender, e) => {

    // Was a primary home found?
    if (ThisApp.HomeManager.PrimaryHome == null) {
        // Ask user to add a home
        PerformSegue("AddHomeSegue",this);
    }
};

Cuando home Manager realiza una conexión con HomeKit, el DidUpdateHomes evento se desencadenará, los hogares existentes se cargarán en la colección de hogares del administrador y se cargará el hogar principal, si está disponible.

Adición de una casa principal

Si la PrimaryHome propiedad de es null después de HMHomeManager un DidUpdateHomes evento, debe proporcionar una manera para que el usuario cree y asigne una casa principal antes de continuar.

Normalmente, la aplicación presentará un formulario para que el usuario asigne un nombre a un nuevo hogar que, a continuación, se pasa al Administrador principal para configurarlo como inicio principal. Para la aplicación de ejemplo HomeKitIntro , se creó una vista modal en el Generador de interfaces de Xcode y la llamó desde la AddHomeSegue interfaz principal de la aplicación.

Proporciona un campo de texto para que el usuario escriba un nombre para el nuevo inicio y un botón para agregar el inicio. Cuando el usuario pulsa el botón Agregar inicio , el código siguiente llama al Administrador principal para agregar el inicio:

// Add new home to HomeKit
ThisApp.HomeManager.AddHome(HomeName.Text,(home,error) =>{
    // Did an error occur
    if (error!=null) {
        // Yes, inform user
        AlertView.PresentOKAlert("Add Home Error",string.Format("Error adding {0}: {1}",HomeName.Text,error.LocalizedDescription),this);
        return;
    }

    // Make the primary house
    ThisApp.HomeManager.UpdatePrimaryHome(home,(err) => {
        // Error?
        if (err!=null) {
            // Inform user of error
            AlertView.PresentOKAlert("Add Home Error",string.Format("Unable to make this the primary home: {0}",err.LocalizedDescription),this);
            return ;
        }
    });

    // Close the window when the home is created
    DismissViewController(true,null);
});

El AddHome método intentará crear un nuevo inicio y devolverlo a la rutina de devolución de llamada especificada. Si la error propiedad no nulles , se ha producido un error y se debe presentar al usuario. Los errores más comunes son causados por un nombre de inicio no único o el Administrador principal no puede comunicarse con HomeKit.

Si el inicio se creó correctamente, debe llamar al UpdatePrimaryHome método para establecer el nuevo inicio como principal. De nuevo, si la error propiedad no nulles , se ha producido un error y se debe presentar al usuario.

También debe supervisar los eventos y el Administrador DidAddHome principal y DidRemoveHome actualizar la interfaz de usuario de la aplicación según sea necesario.

Importante

El AlertView.PresentOKAlert método usado en el código de ejemplo anterior es una clase auxiliar en la aplicación HomeKitIntro que facilita el trabajo con las alertas de iOS.

Buscar nuevos accesorios

Una vez que se ha definido o cargado una casa principal desde home Manager, la aplicación de Xamarin.iOS puede llamar HMAccessoryBrowser a para buscar cualquier nuevo accesorios de automatización doméstica y agregarlos a un hogar.

Llame al StartSearchingForNewAccessories método para empezar a buscar nuevos accesorios y el StopSearchingForNewAccessories método cuando termine.

Importante

StartSearchingForNewAccessories no debe dejarse en funcionamiento durante largos períodos de tiempo, ya que afectará negativamente tanto a la duración de la batería como al rendimiento del dispositivo iOS. Apple sugiere llamar StopSearchingForNewAccessories después de un minuto o solo buscar cuando se presenta al usuario la interfaz de usuario buscar accesorios.

Se DidFindNewAccessory llamará al evento cuando se detecten nuevos accesorios y se agregarán a la DiscoveredAccessories lista en el Examinador de accesorios.

La DiscoveredAccessories lista contendrá una colección de HMAccessory objetos que definen un dispositivo de automatización del hogar habilitado para HomeKit y sus servicios disponibles, como luces o control de puertas de garaje.

Una vez encontrado el nuevo accesorio, debe presentarse al usuario y así poder seleccionarlo y agregarlo a una casa. Ejemplo:

Finding a new accessory

Llame al AddAccessory método para agregar el accesorio seleccionado a la colección del hogar. Por ejemplo:

// Add the requested accessory to the home
ThisApp.HomeManager.PrimaryHome.AddAccessory (_controller.AccessoryBrowser.DiscoveredAccessories [indexPath.Row], (err) => {
    // Did an error occur
    if (err !=null) {
        // Inform user of error
        AlertView.PresentOKAlert("Add Accessory Error",err.LocalizedDescription,_controller);
    }
});

Si la err propiedad no nulles , se ha producido un error y se debe presentar al usuario. De lo contrario, se le pedirá al usuario que escriba el código de configuración para que el dispositivo agregue:

Enter the setup code for the device to add

En el simulador de accesorios HomeKit, este número se puede encontrar en el campo Código de instalación:

The Setup Code field in the HomeKit Accessory Simulator

Para los accesorios homeKit reales, el código de instalación se imprimirá en una etiqueta en el propio dispositivo, en la caja del producto o en el manual de usuario del accesorio.

Debe supervisar el evento de DidRemoveNewAccessory Accessory Browser y actualizar la interfaz de usuario para quitar un accesorio de la lista disponible una vez que el usuario lo haya agregado a su Colección principal.

Trabajar con accesorios

Una vez establecida una casa principal y se han agregado accesorios, puede presentar una lista de accesorios (y opcionalmente habitaciones) para que el usuario trabaje con él.

El HMRoom objeto contiene toda la información sobre una sala determinada y los accesorios que le pertenecen. Opcionalmente, las habitaciones se pueden organizar en una o varias zonas. Contiene HMZone toda la información sobre una zona determinada y todas las salas que pertenecen a ella.

Para este ejemplo, mantendremos las cosas sencillas y trabajaremos directamente con los accesorios de una casa, en lugar de organizarlas en salas o zonas.

El HMHome objeto contiene una lista de accesorios asignados que se pueden presentar al usuario en su Accessories propiedad. Por ejemplo:

An example accessory

Formulario aquí, el usuario puede seleccionar un accesorio determinado y trabajar con los servicios que proporciona.

Trabajar con servicios

Cuando el usuario interactúa con un dispositivo de automatización residencial habilitado para HomeKit determinado, normalmente es a través de los servicios que proporciona. La Services propiedad de la HMAccessory clase contiene una colección de HMService objetos que definen los servicios que ofrece un dispositivo.

Los servicios son cosas como luces, termostatos, aperturas de puertas de garaje, interruptores o bloqueos. Algunos dispositivos (como un abiertor de puertas de garaje) proporcionarán más de un servicio, como una luz y la capacidad de abrir o cerrar una puerta.

Además de los servicios específicos que proporciona un accesorio determinado, cada accesorio contiene un Information Service que define propiedades como su nombre, fabricante, modelo y número de serie.

Tipos de servicio de accesorios

Los siguientes tipos de servicio están disponibles a través de la HMServiceType enumeración :

  • AccessoryInformation : proporciona información sobre el dispositivo de automatización doméstica (accesorio) dado.
  • AirQualitySensor : define un sensor de calidad del aire.
  • Batería : define el estado de la batería de un accesorio.
  • CarbonDióxidoSensor : define un sensor de dióxido de carbono.
  • CarbonMonóxidoSensor : define un sensor de monóxido de carbono.
  • ContactSensor : define un sensor de contacto (por ejemplo, una ventana que se abre o cierra).
  • Puerta : define un sensor de estado de puerta (como abierto o cerrado).
  • Ventilador : define un ventilador controlado a distancia.
  • GarageDoorOpener - Define un abrir puertas de garaje.
  • HumiditySensor : define un sensor de humedad.
  • LeakSensor : define un sensor de fuga (como para un calentador de agua caliente o lavadora).
  • LightBulb : define una luz independiente o una luz que forma parte de otro accesorio (como un abiertor de puertas de garaje).
  • LightSensor : define un sensor de luz.
  • LockManagement : define un servicio que administra un bloqueo de puerta automatizado.
  • LockMechanism : define un bloqueo controlado a distancia (como un bloqueo de puerta).
  • MotionSensor : define un sensor de movimiento.
  • OcupaciónSensor : define un sensor de ocupación.
  • Salida : define una toma de pared controlada remota.
  • SecuritySystem : define un sistema de seguridad residencial.
  • StatefulProgrammableSwitch : define un conmutador programable que permanece en un estado de concesión una vez desencadenado (como un conmutador de volteo).
  • StatelessProgrammableSwitch : define un modificador programable que vuelve a su estado inicial después de desencadenarse (como un botón de inserción).
  • SmokeSensor : define un sensor de humo.
  • Switch : define un interruptor de encendido y apagado como un interruptor de pared estándar.
  • TemperatureSensor : define un sensor de temperatura.
  • Termostato : define un termostato inteligente que se usa para controlar un sistema HVAC.
  • Ventana : define una ventana automatizada que se puede abrir o cerrar de forma remota.
  • WindowCovering : define una cubierta de ventana controlada de forma remota, como persianas que se pueden abrir o cerrar.

Mostrar información del servicio

Después de cargar un HMAccessory , puede consultar los objetos individuales HNService que proporciona y mostrar esa información al usuario:

Displaying Service Information

Siempre debe comprobar la Reachable propiedad de un HMAccessory antes de intentar trabajar con ella. Un accesorio puede ser inaccesible que el usuario no esté dentro del intervalo del dispositivo o si se ha desconectado.

Una vez seleccionado un servicio, el usuario puede ver o modificar una o varias características de ese servicio para supervisar o controlar un dispositivo de automatización doméstica determinado.

Trabajar con características

Cada HMService objeto puede contener una colección de HMCharacteristic objetos que pueden proporcionar información sobre el estado del servicio (como una puerta abierta o cerrada) o permitir al usuario ajustar un estado (como establecer el color de una luz).

HMCharacteristic no solo proporciona información sobre una característica y su estado, sino que también proporciona métodos para trabajar con el estado a través de metadatos de características (HMCharacteristisMetadata). Estos metadatos pueden proporcionar propiedades (como intervalos de valores mínimos y máximos) que son útiles al mostrar información al usuario o permitirles modificar estados.

La HMCharacteristicType enumeración proporciona un conjunto de valores de metadatos característicos que se pueden definir o modificar de la siguiente manera:

  • Administración OnlyAccess
  • AirParticulateDensity
  • AirParticulateSize
  • AirQuality
  • AudioFeedback
  • BatteryLevel
  • Brillo
  • CarbonDióxidoDetected
  • CarbonDióxidoLevel
  • CarbonDióxidoPeakLevel
  • CarbonMonóxidoDetected
  • CarbonMonóxidoLevel
  • CarbonMonóxidoPeakLevel
  • ChargingState
  • ContactState
  • CoolingThreshold
  • CurrentDoorState
  • CurrentHeatingCooling
  • CurrentHorizontalTilt
  • CurrentLightLevel
  • CurrentLockMechanismState
  • CurrentPosition
  • CurrentRelativeHumidity
  • CurrentSecuritySystemState
  • CurrentTemperature
  • CurrentVerticalTilt
  • FirmwareVersion
  • HardwareVersion
  • HeatingCoolingStatus
  • HeatingThreshold
  • HoldPosition
  • Hue
  • Identificación
  • InputEvent
  • LeakDetected
  • LockManagementAutoSecureTimeout
  • LockManagementControlPoint
  • LockMechanismLastKnownAction
  • Registros
  • Fabricante
  • Modelo
  • MotionDetected
  • Nombre
  • ObstrucciónDetected
  • OcupaciónDetected
  • OutletInUse
  • OutputState
  • PositionState
  • PowerState
  • RotationDirection
  • RotationSpeed
  • Saturación
  • SerialNumber
  • SmokeDetected
  • SoftwareVersion
  • StatusActive
  • StatusFault
  • StatusJammed
  • StatusLowBattery
  • StatusTampered
  • TargetDoorState
  • TargetHeatingCooling
  • TargetHorizontalTilt
  • TargetLockMechanismState
  • TargetPosition
  • TargetRelativeHumidity
  • TargetSecuritySystemState
  • TargetTemperature
  • TargetVerticalTilt
  • TemperatureUnits
  • Versión

Trabajar con el valor de una característica

Para asegurarse de que la aplicación tiene el estado más reciente de una característica determinada, llame al ReadValue método de la HMCharacteristic clase . Si la err propiedad no nulles , se ha producido un error y puede presentarse o no al usuario.

La propiedad Característica Value contiene el estado actual de la característica dada como NSObjecty, como tal, no se puede trabajar directamente en C#.

Para leer el valor, se agregó la siguiente clase auxiliar a la aplicación de ejemplo HomeKitIntro :

using System;
using Foundation;
using System.Globalization;
using CoreGraphics;

namespace HomeKitIntro
{
    /// <summary>
    /// NS object converter is a helper class that helps to convert NSObjects into
    /// C# objects
    /// </summary>
    public static class NSObjectConverter
    {
        #region Static Methods
        /// <summary>
        /// Converts to an object.
        /// </summary>
        /// <returns>The object.</returns>
        /// <param name="nsO">Ns o.</param>
        /// <param name="targetType">Target type.</param>
        public static Object ToObject (NSObject nsO, Type targetType)
        {
            if (nsO is NSString) {
                return nsO.ToString ();
            }

            if (nsO is NSDate) {
                var nsDate = (NSDate)nsO;
                return DateTime.SpecifyKind ((DateTime)nsDate, DateTimeKind.Unspecified);
            }

            if (nsO is NSDecimalNumber) {
                return decimal.Parse (nsO.ToString (), CultureInfo.InvariantCulture);
            }

            if (nsO is NSNumber) {
                var x = (NSNumber)nsO;

                switch (Type.GetTypeCode (targetType)) {
                case TypeCode.Boolean:
                    return x.BoolValue;
                case TypeCode.Char:
                    return Convert.ToChar (x.ByteValue);
                case TypeCode.SByte:
                    return x.SByteValue;
                case TypeCode.Byte:
                    return x.ByteValue;
                case TypeCode.Int16:
                    return x.Int16Value;
                case TypeCode.UInt16:
                    return x.UInt16Value;
                case TypeCode.Int32:
                    return x.Int32Value;
                case TypeCode.UInt32:
                    return x.UInt32Value;
                case TypeCode.Int64:
                    return x.Int64Value;
                case TypeCode.UInt64:
                    return x.UInt64Value;
                case TypeCode.Single:
                    return x.FloatValue;
                case TypeCode.Double:
                    return x.DoubleValue;
                }
            }

            if (nsO is NSValue) {
                var v = (NSValue)nsO;

                if (targetType == typeof(IntPtr)) {
                    return v.PointerValue;
                }

                if (targetType == typeof(CGSize)) {
                    return v.SizeFValue;
                }

                if (targetType == typeof(CGRect)) {
                    return v.RectangleFValue;
                }

                if (targetType == typeof(CGPoint)) {
                    return v.PointFValue;
                }
            }

            return nsO;
        }

        /// <summary>
        /// Convert to string
        /// </summary>
        /// <returns>The string.</returns>
        /// <param name="nsO">Ns o.</param>
        public static string ToString(NSObject nsO) {
            return (string)ToObject (nsO, typeof(string));
        }

        /// <summary>
        /// Convert to date time
        /// </summary>
        /// <returns>The date time.</returns>
        /// <param name="nsO">Ns o.</param>
        public static DateTime ToDateTime(NSObject nsO){
            return (DateTime)ToObject (nsO, typeof(DateTime));
        }

        /// <summary>
        /// Convert to decimal number
        /// </summary>
        /// <returns>The decimal.</returns>
        /// <param name="nsO">Ns o.</param>
        public static decimal ToDecimal(NSObject nsO){
            return (decimal)ToObject (nsO, typeof(decimal));
        }

        /// <summary>
        /// Convert to boolean
        /// </summary>
        /// <returns><c>true</c>, if bool was toed, <c>false</c> otherwise.</returns>
        /// <param name="nsO">Ns o.</param>
        public static bool ToBool(NSObject nsO){
            return (bool)ToObject (nsO, typeof(bool));
        }

        /// <summary>
        /// Convert to character
        /// </summary>
        /// <returns>The char.</returns>
        /// <param name="nsO">Ns o.</param>
        public static char ToChar(NSObject nsO){
            return (char)ToObject (nsO, typeof(char));
        }

        /// <summary>
        /// Convert to integer
        /// </summary>
        /// <returns>The int.</returns>
        /// <param name="nsO">Ns o.</param>
        public static int ToInt(NSObject nsO){
            return (int)ToObject (nsO, typeof(int));
        }

        /// <summary>
        /// Convert to float
        /// </summary>
        /// <returns>The float.</returns>
        /// <param name="nsO">Ns o.</param>
        public static float ToFloat(NSObject nsO){
            return (float)ToObject (nsO, typeof(float));
        }

        /// <summary>
        /// Converts to double
        /// </summary>
        /// <returns>The double.</returns>
        /// <param name="nsO">Ns o.</param>
        public static double ToDouble(NSObject nsO){
            return (double)ToObject (nsO, typeof(double));
        }
        #endregion
    }
}

NSObjectConverter se usa siempre que la aplicación necesite leer el estado actual de una característica. Por ejemplo:

var value = NSObjectConverter.ToFloat (characteristic.Value);

La línea anterior convierte el valor en un float que se puede usar en el código de C# de Xamarin.

Para modificar un HMCharacteristic, llame a su WriteValue método y ajuste el nuevo valor en una NSObject.FromObject llamada. Por ejemplo:

Characteristic.WriteValue(NSObject.FromObject(value),(err) =>{
    // Was there an error?
    if (err!=null) {
        // Yes, inform user
        AlertView.PresentOKAlert("Update Error",err.LocalizedDescription,Controller);
    }
});

Si la err propiedad no nulles , se ha producido un error y se debe presentar al usuario.

Prueba de los cambios de valor de características

Al trabajar con accesorios simulados y con HMCharacteristics ellos, se pueden supervisar modificaciones en la Value propiedad dentro del simulador de accesorios HomeKit.

Con la aplicación HomeKitIntro que se ejecuta en hardware real de dispositivo iOS, los cambios en el valor de una característica deben verse casi al instante en el simulador de accesorios HomeKit. Por ejemplo, cambiar el estado de una luz en la aplicación de iOS:

Changing the state of a light in an iOS app

Debe cambiar el estado de la luz en el simulador de accesorios HomeKit. Si el valor no cambia, compruebe el estado del mensaje de error al escribir nuevos valores de características y asegúrese de que el accesorio sigue siendo accesible.

Características avanzadas de HomeKit

En este artículo se han tratado las características básicas necesarias para trabajar con accesorios HomeKit en una aplicación de Xamarin.iOS. Sin embargo, hay varias características avanzadas de HomeKit que no se tratan en esta introducción:

  • Salas - Accesorios habilitados para HomeKit se pueden organizar opcionalmente en salas por parte del usuario final. Esto permite que HomeKit presente accesorios de una manera fácil de entender y trabajar con el usuario. Para obtener más información sobre cómo crear y mantener salas, consulte la documentación de HMRoom de Apple.
  • Zonas : opcionalmente, las salas se pueden organizar en zonas por parte del usuario final. Una zona hace referencia a una colección de salas que el usuario podría tratar como una sola unidad. Por ejemplo: Arriba, Abajo o Sótano. De nuevo, esto permite que HomeKit presente y trabaje con accesorios de una manera que tenga sentido para el usuario final. Para obtener más información sobre cómo crear y mantener zonas, consulte la documentación de HMZone de Apple.
  • Acciones y conjuntos de acciones: las acciones modifican las características del servicio de accesorios y se pueden agrupar en conjuntos. Los conjuntos de acciones actúan como scripts para controlar un grupo de accesorios y coordinar sus acciones. Por ejemplo, un script "Watch TV" podría cerrar las persianas, atenuar las luces y encender el televisor y su sistema de sonido. Para obtener más información sobre cómo crear y mantener acciones y conjuntos de acciones, consulte la documentación de HMAction y HMActionSet de Apple.
  • Desencadenadores: un desencadenador puede activar uno o varios conjuntos de acciones cuando se ha cumplido un conjunto determinado de condiciones. Por ejemplo, active la luz del porche y cierre todas las puertas externas cuando se oscurece fuera. Para obtener más información sobre cómo crear y mantener desencadenadores, consulte la documentación de HMTrigger de Apple.

Dado que estas características usan las mismas técnicas presentadas anteriormente, deberían ser fáciles de implementar siguiendo la Guía homeKitDeveloper de Apple, las directrices de la interfaz de usuario de HomeKit y la referencia del marco HomeKit.

Directrices de revisión de aplicaciones homeKit

Antes de enviar una aplicación de Xamarin.iOS habilitada para HomeKit a iTunes Conectar para su lanzamiento en iTunes App Store, asegúrese de seguir las directrices de Apple para aplicaciones habilitadas para HomeKit:

  • El propósito principal de la aplicación debe ser la automatización doméstica si se usa el marco HomeKit.
  • El texto de marketing de la aplicación debe notificar a los usuarios que se está usando HomeKit y deben proporcionar una directiva de privacidad.
  • La recopilación de información de usuario o el uso de HomeKit para publicidad está estrictamente prohibido.

Para obtener las directrices de revisión completas, consulta Directrices de revisión de App Store de Apple.

Novedades de iOS 9

Apple ha realizado los siguientes cambios y adiciones a HomeKit para iOS 9:

  • Mantener objetos existentes: si se modifica un accesorio existente, el Administrador principal (HMHomeManager) le informará del elemento específico que se modificó.
  • Identificadores persistentes: todas las clases HomeKit pertinentes ahora incluyen una UniqueIdentifier propiedad para identificar de forma única un elemento determinado en aplicaciones habilitadas para HomeKit (o instancias de la misma aplicación).
  • Administración de usuarios: se ha agregado un controlador de vista integrado para proporcionar administración de usuarios a través de los usuarios que tienen acceso a los dispositivos HomeKit en el hogar del usuario principal.
  • Funcionalidades de usuario: los usuarios de HomeKit ahora tienen un conjunto de privilegios que controlan las funciones que pueden usar en los accesorios habilitados para HomeKit y HomeKit. La aplicación solo debe mostrar las funcionalidades pertinentes para el usuario actual. Por ejemplo, solo los administradores deben poder mantener a otros usuarios.
  • Escenas predefinidas: las escenas predefinidas se han creado para cuatro eventos comunes que se producen para el usuario de HomeKit promedio: Get Up, Leave, Return, Go to Bed. Estas escenas predefinidas no se pueden eliminar de un hogar.
  • Escenas y Siri : Siri tiene una compatibilidad más profunda con Escenas en iOS 9 y puede reconocer el nombre de cualquier escena definida en HomeKit. Un usuario puede ejecutar una escena simplemente hablando su nombre a Siri.
  • Categorías de accesorios: se ha agregado un conjunto de categorías predefinidas a todos los accesorios y ayuda a identificar el tipo de accesorio que se agrega a un Hogar o se trabaja desde dentro de la aplicación. Estas nuevas categorías están disponibles durante la configuración del accesorio.
  • Soporte técnico de Apple Watch: HomeKit ya está disponible para watchOS y Apple Watch podrá controlar los dispositivos habilitados para HomeKit sin i Teléfono estar cerca del reloj. HomeKit para watchOS admite las siguientes funcionalidades: Ver hogares, controlar accesorios y ejecutar escenas.
  • Nuevo tipo de desencadenador de eventos: además de los desencadenadores de tipo de temporizador admitidos en iOS 8, iOS 9 ahora admite desencadenadores de eventos basados en el estado del accesorio (como los datos del sensor) o la geolocalización. Los desencadenadores de eventos usan NSPredicates para establecer condiciones para su ejecución.
  • Acceso remoto: con acceso remoto, el usuario ahora puede controlar sus accesorios homeKit habilitados para Home Automation cuando están lejos de la casa en una ubicación remota. En iOS 8, esto solo se admitía si el usuario tenía un Apple TV de 3ª generación en el hogar. En iOS 9, esta limitación se levanta y se admite el acceso remoto a través de iCloud y el Protocolo de accesorios HomeKit (HAP).
  • Nuevas capacidades bluetooth de bajo consumo (BLE): HomeKit ahora admite más tipos de accesorios que pueden comunicarse a través del protocolo Bluetooth Low Energy (BLE). Mediante la tunelización segura haP, un accesorio HomeKit puede exponer otro accesorio Bluetooth a través de Wi-Fi (si está fuera del intervalo Bluetooth). En iOS 9, los accesorios BLE admiten notificaciones y metadatos.
  • Nuevas categorías de accesorios : Apple agregó las siguientes nuevas categorías de accesorios en iOS 9: Coberturas de ventanas, Puertas motorizadas y Ventanas, Sistemas de alarma, sensores y conmutadores programables.

Para obtener más información sobre las nuevas características de HomeKit en iOS 9, consulte el índice HomeKit de Apple y el vídeo Novedades de HomeKit.

Resumen

En este artículo se ha introducido el marco de automatización del hogar HomeKit de Apple. Se mostró cómo configurar y configurar dispositivos de prueba mediante el simulador de accesorios HomeKit y cómo crear una aplicación sencilla de Xamarin.iOS para detectar, comunicarse con dispositivos de automatización doméstica y controlarlos mediante HomeKit.