[Windows Phone 8.1] Las nuevas aplicaciones universales

Hola a todos!

En el primer artículo de esta serie sobre Windows Phone 8.1 hablamos de las nuevas herramientas, en el segundo hablamos sobre los nuevos modelos de desarrollo. En esta ocasión toca hablar sobre una de las mayores novedades: Las aplicaciones universales. Comencemos!

Después de ver las nuevas herramientas, APIs y tipos de desarrollo, vamos a examinar las nuevas plantillas que tenemos a nuestra disposición. En este sentido también se han producido muchos cambios.

image_thumb16

Como podemos ver en la captura anterior, se han reorganizado las plantillas de proyecto de Windows Store, creando una nueva categoría “Store” que engloba tres subcategorías:

  • Universal Apps. Los nuevos tipos de aplicaciones universales que nos permiten desarrollar apps para Windows Store y Windows Phone 8.1
  • Windows Apps. Aquí encontraremos las plantillas que ya existían para Windows Store.
  • Windows Phone Apps. Aquí tendremos las plantillas de Windows XAML para Windows Phone 8.1.

Además, seguimos teniendo la categoría Wndows Phone, donde tendremos las plantillas para trabajar con Silverlight para Windows Phone (8.0 y 8.1).

La mayor novedad en este sentido viene en las plantillas universales. ¿Qué es una aplicación universal? Este concepto de “universal” nos indica que podremos crear un proyecto en el que facilmente podremos compartir XAML, código y recursos entre una aplicación Windows Store y una aplicación Windows Phone 8.1. Básicamente se crea un proyecto “Universal” que internamente contendrá tres sub proyectos:

  • Windows, con todo lo específico de Windows Store.
  • Windows Phone, con todo lo específico de Windows Phone.
  • Shared, con todo el código que queramos compartir entre ambas plataformas.

image_thumb19

Con esta organización será muy sencillo compartir código entre ambos sistemas. Por defecto, el app.xaml (y app,xaml.cs) yo se incluye en el proyecto Shared, por lo que es compartido para ambas plataformas. Imágenes comunes, controles que queramos reaprovechar (si, también podemos compartir XAML), Converters, ViewModels, Servicios de acceso al hardware, Diccionarios de recursos, incluso los archivos RESW con idiomas, pueden ser colocados en el proyecto shared.

image_thumb5

Luego, simplemente tendremos que colocar en cada proyecto particular las páginas de la aplicación. ¿Podríamos compartir las páginas también? Bueno, técnicamente si. Pero no funcionaría a nivel de experiencia de usuario. Los tamaños de pantalla entre una aplicación Store y Phone son muy diferentes. Algo tan básico como la orientación, que en Phone es vertical mientras normalmente en Store es horizontal, hace que usar la misma página para ambas sea muy complicado. De esta forma, en nuestros proyectos Phone y Store, acabaríamos teniendo las páginas que componen la aplicación y quizás alguna pieza de código que no queramos compartir por ser exclusiva de la plataforma:

image_thumb8[1]

Lo mejor es que, desde el proyecto Shared tendremos acceso a cualquier objeto creado en los proyectos específicos y viceversa. Desde cualquiera de los proyectos de Phone o Store tendremos total acceso al código del proyecto Shared. De esta forma podremos compartir la gran mayoría de código. Siempre encontraremos ciertas cosas que difieren entre las plataformas o funcionalidades que están solo en una de ellas.

Por poner un ejemplo, podemos hablar del FileOpenPicker. En Windows Store usamos los métodos PickSingleFileAsync o PickMultipleFilesAsync. Estos métodos devuelven, respectivamente, un StorageFile o una lista de StorageFile. Al invocarlos, nuestra aplicación sigue en ejecución mientras sobre ella se carga la interface del selector. El problema en Windows Phone viene dado por los dispositivos de baja memoria. En la mayoría de los casos resultaba imposible mantener abierta la aplicación mientras se cargaba la interface del picker. La solución llego por crear dos nuevos métodos llamados PickSingleFileAndContinue y PickMultipleFilesAndContinue. Fijaros  que estos métodos no son asíncronos. No devuelven nada. Cuando los invocamos, nuestra aplicación se suspende y se lanza la aplicación del selector. El usuario selecciona un archivo, presiona atrás o cancela y en ese momento se restaura nuestra aplicación, enviando en los argumentos del evento Activated el resultado de la operación. Debemos ser nosotros los encargados de enviar el archivo a la página/viewmodel correcta y gestionar el estado de la misma. ¿Como podemos compartir este código? Pues de dos formas distintas:

  • Podemos crear un servicio, cuya interface esté en el proyecto Shared y tenga una implementación distinta para cada plataforma.
  • Podemos usar bloques condicionales de compilación. Por defecto el proyecto universal define el símbolo WINDOWS_APP en el proyecto Windows Store y WINDOWS_PHONE_APP en el proyecto Windows Phone.

En próximos artículos hablaremos a fondo de los pickers disponibles y como usarlos. De la misma forma ocurre con algunas cosas más como las transiciones entre páginas. Por lo que, aunque podremos compartir un 80 o 90% del código todavía tendremos algunas cosas para las que tendremos que usar alguno de los puntos anteriores. Pero otras estarán totalmente unificadas: El sistema de navegación, el XAML y los controles, localización… y muchas cosas más.

Otra novedad para los proyectos universales, es que ahora dispondremos de Portable Class Libraries con soporte completo WinRT. Hasta el momento en una PCL solo podíamos usar código .NET. Con el nuevo SDK, tendremos como target Windows Store (Windows 8.1) y Windows Store (Windows Phone 8.1). Si seleccionamos estos dos frameworks solamente, la librería nos permitirá tener código WinRT, incluso XAML dentro de ella.

Y con esto llegamos al fin de este artículo. En el próximo empezaremos a ver código de verdad, con algunos ejemplos de las novedades que incluye Windows Phone 8.1.

Un saludo y Happy Coding!

3 comentarios sobre “[Windows Phone 8.1] Las nuevas aplicaciones universales”

  1. Hola Josue,

    Excelente novedad, cada vez un pasito más cerca aplicaciones que sirven para windows 8 y para windows phone.

    Tengo algunas dudas:

    La gestión que hay que hacer en windows 8 en cuanto al momento en que entra en estado de suspensión una app, que puede ser cerrada en cualquier momento si se necesita memoria y es necesario almacenar los datos necesarios para volver al mismo punto si se restaura, ¿es igual en windows phone 8.1?¿Y puede ser esta lógica compartida en el proyecto shared?

    Y la otra, las configuraciones de un usuario que se almacenan a nivel roaming pueden ser compartidas entre la versión de la app de windows 8 y la windows phone 8.1?

    Gracias y saludos.

Responder a anonymous Cancelar respuesta

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