[Windows 10] Extensions SDK

Introducción

Desde la llegada de las Apps Universales ya con el SDK de Windows
Phone 8.1 se denotaba el esfuerzo por facilitar a los desarrolladores la
posibilidad de crear Apps para varias plataformas compartiendo la mayor
cantidad de código posible. Sin embargo, no debemos olvidar que la App
tiene como destino múltiples plataformas con características muy
diferentes.

¿Cómo se gestionan las características específicas de cada plataforma?

Antes de Windows 10

Con la llegada de las Apps Universales tuvimos una solución con tres
proyectos, uno específico para Windows, otro para Windows Phone y un
tercer proyecto llamado Shared donde añadir la mayor cantidad de código compartido posible. El resultado de la compilación eran dos binarios, uno por plataforma.

A nivel de desarrollo, a pesar del esfuerzo visible en la congergencia
entre plataformas, no todas las APIs estaban 100% compartidas.

Ante casos de APIs no compartidas o específicas de una plataforma teníamos múltiples opciones:

  • Colocar el código específico en cada proyecto de cada plataforma.
  • Utilizar directivas de compilación en clases compartidas.

Mediante directivas de compilación podemos elegir que parte del
código ejecutar dependiendo de la plataforma donde se ejecute. Se debe
utilizar sólo para pequeños trozos de código. Hay que tener en cuenta
que aunque logramos nuestro objetivo, en algunos casos estamos
duplicando código.

Con la llegada de Windows 10

Con la llegada del SDK de Windows 10 Preview tenemos la posibilidad de crear Apps Universales con un único binario
que funcione en múltiples plataformas. Tenemos acceso a una gran
cantidad de APIs totalmente compartidas pero… ¿que ocurre cuando
necesitamos acceder a APIs específicas de una plataforma?

La respuesta a la pregunta son los Extensions SDK. Por cada familia de dispositivo contamos con una serie de extensiones que nos permiten acceder a APIs específicas.

NOTA: Por ahora, en la versión disponible de las
herramientas de desarrollo para Windows 10 Technical Preview contamos
con extensiones para Desktop y Mobile.

Añadiendo extensiones

Para añadir una extensión correspondiente a una familia de
dispositivo hacemos clic derecho sobre las referencias del proyecto y
seleccionamos la opción Add Reference…

Accediendo al apartado Extensions dentro de Universal App Platform:

Tenemos disponible la extensión para Desktop y Mobile.

Trabajando con extensiones

Al trabajar con extensiones siempre debemos realizar verificaciones
de si la API específica de una familia de dispositivos con la que
deseamos trabajar esta disponible o no. Si no realizamos verificaciones y
la llamada a la API de una extensión se ejecuta en un dispositivo que
no soporta dicha extensión, obtendremos una excepción.

Vimos previamente como se gestionaba en Windows Phone 8.1 mediante
directivas de compilación la pulsación de la tecla volver. A
continuación, vamos a ver exactamente lo mismo utilizando Extensions SDK
en Windows 10.

Tras añadir la extensión Mobile:

En el constructor de la App en el archivo App.xaml.cs añadimos:

 HardwareButtons.BackPressed += HardwareButtons_BackPressed;

Con el evento asociado:

private void HardwareButtons_BackPressed(object sender, BackPressedEventArgs e)
{
    //TODO:
}

Tan sencillo como esto pero si ejecutamos en Windows la App…

Como comentamos previamente debemos añadir verificaciones para asegurar que el dispositivo soporta la extensión o no:

if (ApiInformation.IsTypePresent("Windows.Phone.UI.Input.HardwareButtons"))
     HardwareButtons.BackPressed += HardwareButtons_BackPressed;

Utilizamos el método IsTypePresent de la clase estática ApiInformation incluida dentro del namespace Windows.Foundation.Metadata.

NOTA: En la clase estática ApiInformation tenemos métodos para verificar no solo tipos, sino métodos, propiedades, contratos, etc.

La verificación se realiza con el nombre completo del tipo en una cadena.

NOTA: Sin duda no es quizás la manera más óptima
para realizar la comprobación. Recordad que estamos ante una versión
Preview de las herramientas.

Podéis descargar el  pequeño ejemplo realizado a continuación:

También podéis acceder al código fuente directamente en GitHub:

Ver GitHub

Recordar que cualquier tipo de duda o sugerencia la podéis dejar en los comentarios de la entrada.

Más información

Deja un comentario

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *