Windows Phone Developer Summit: Windows Phone 8

Hoy se ha presentado Windows Phone 8 oficialmente al mundo, muchas buenas noticias y una sola mala… repasémoslas todas!

Hardware

Esta es una de las actualizaciones más esperadas en Windows Phone:

  • Procesadores multi core
  • Tres resoluciones de pantalla: 480×800, 720×1200 y 768×1280
  • Tarjetas MicroSD
  • NFC

Han asegurado que no tendremos que preocuparnos por las resoluciones y que el sistema se encargará de realizar un escalado de todos nuestros assets por nosotros. Por supuesto, las aplicaciones especialmente desarrolladas para Windows Phone 8 podrán prepararse para estas tres resoluciones y ser mucho más impactantes y llamativas.

Windows 8 y Windows Phone 8

La nueva versión del sistema operativo móvil de Microsoft abandonará el Kernel de Windows CE que incorporaba hasta Windows Phone 7.5 y pasará a usar el kernel de su hermano mayor: Windows 8. Junto con el se compartirán también el sistema de archivos, el sistema multimedia los drivers y partes del modelo de seguridad de Windows 8.

Además se unificará el desarrollo de forma notable, haciendo que portar aplicaciones entre Windows 8 y Windows Phone 8 sea muy sencillo. Dejaremos de lado Silverlight y pasaremos a usar un modelo de desarrollo con C#/VB + XAML altamente parecido al que tenemos en las aplicaciones metro de Windows 8. Para los juegos disfrutaremos de C/C++ y DirectX con soporte nativo total. También se incluye el soporte oficial para SQLite, tanto en Windows 8 como en Windows Phone 8. Cuando esté disponible, el nuevo SDK de Windows Phone nos permitirá crear aplicaciones para Windows Phone 7.5 o Windows Phone 8 directamente desde Visual Studio 2012.

Si no has empezado ya, es buen momento para comenzar a aprender a desarrollar para Windows 8, lo que te ahorrará mucho camino en Windows Phone 8, revisa mi serie de artículos sobre desarrollo metro en Windows 8 aquí

El punto negativo, cambiamos de sistema de desarrollo, kernel, etc… Aunque no lo han mencionado, se cae de maduro: las apps que desarrollemos para Windows Phone 8 no serán compatibles con Windows Phone 7.X

Nuevas Apis

Aunque supongo que en este terreno tendremos muchas más novedades, hemos podido ver un pequeño retazo de lo que se nos avecina: Background agent para VoIp, que nos permitirá crear software voip que se integre directamente con el sistema de llamadas y que permanezca en ejecución en segundo plano. También localización en background, pudiendo tener nuestras aplicaciones accediendo a los sistemas de geoposicionamiento aunque pasemos a otra app o apaguemos la pantalla y la novedad más espectacular a mi modo de ver: api de reconocimiento de voz para todas las aplicaciones, facil y rápida de usar. Un 10 en este apartado para Microsoft, si esto es así ahora, cuando salga el sistema las novedades serán abrumadoras!

Aunque no se ha dicho que nivel de acceso tendremos a ello, es también remarcable que todos lo mapas que se usarán en la plataforma serán los Nokia Maps, reemplazando a Bing maps. Esto, si has probado un lumia alguna vez, es una gran noticia. Tendremos mapas offline, direcciones por voz y todo lo que integra Nokia Drive en estos momentos.

Nueva pantalla de inicio

Una de las novedades más visuales y que más me han gustado: ahora podremos personalizar mucho más nuestra pantalla de inicio, escogiendo el tamaño de nuestros tiles entre tres disponibles: el normal que tienen ahora, todo el ancho disponible o 1/4 del normal:

start01start02

La verdad es que me ha parecido increíble toda la información que podemos configurar en nuestra pantalla de inicio y como poder darle más importancia a lo que realmente sea importante para nosotros. Muy bien por Microsoft, este es el empujón definitivo a la UX de Windows Phone!

Características empresariales

Una novedad muy esperada eran las nuevas características empresariales, la más importante el poder distribuir aplicaciones a los terminales de tu organización sin necesidad de pasar por el marketplace, algo que asustaba a muchas empresas y las retraía en la adopción de la plataforma. Ahora tendremos un hub corporativo donde podremos encontrar las aplicaciones disponibles de nuestra empresa e instalarlas y acceder a ellas.

La mala noticia

Pero no todo puede ser de color de rosa, quizás por el profundo cambio del core, recordemos que cambiar el kernel a un sistema operativo no es un simple update, es un cambio total de drivers, firmware, etc… El hecho es que no tendremos Windows Phone 8 para los dispositivos actuales, para ninguno, ni siquiera para el nuevo y flamante Lumia 900 que todavía esta siendo lanzado en Europa. En cambio, tendremos un nuevo update, Windows Phone 7.8 que nos traerá la nueva pantalla de inicio y por lo que se sabe, poco más, habrá que esperar a tener más noticias

wp78

[Windows 8] Apps Metro para desarrolladores Windows Phone 7.5 (9 de N)

Hola a todos!

Aquí estamos una vez más con un nuevo artículo de nuestra serie sobre desarrollo de aplicaciones metro en C# y XAML. En esta ocasión vamos a hablar de como asegurarnos de que disponemos de conectividad a internet y como poder usar esta conectividad para consumir servicios.

Comprobar la conectividad

Uno de los requisitos más importantes a tener en cuenta en una aplicación Windows Phone es el de comprobar si tenemos acceso a internet antes de intentar usarla, para así poder avisar al usuario y que nuestra aplicación no falle sin más.

En Windows Phone conseguimos esto haciendo uso de la clase NetworkInterface que nos facilita un método GetIsNetworkAvailable, este método devuelve true si tenemos conexión o false de lo contrario:

   1:  if (NetworkInterface.GetIsNetworkAvailable())
   2:  {
   3:      MessageBox.Show("Network connection available");
   4:  }
   5:  else
   6:  {
   7:      MessageBox.Show("No network connection at this time");
   8:  }

La forma en la que podemos realizar este mismo paso en WinRT es, si cabe, más sencilla. Solo tenemos que registrarnos al evento NetworkStatusChanged y automáticamente obtendremos una notificación cuando el estado de la conexión cambie, momento en el cual podremos preguntar cual es el estado actual usando la clase NetworkInterface del namespace Windows.Networking.Connectivity de forma muy similar a Windows Phone:

   1:  public static bool NetworkAvailable = true;
   2:   
   3:  public App()
   4:  {
   5:      this.InitializeComponent();
   6:      this.Suspending += OnSuspending;
   7:      NetworkInformation.NetworkStatusChanged += NetworkInformation_NetworkStatusChanged;
   8:   
   9:  }
  10:   
  11:  void NetworkInformation_NetworkStatusChanged(object sender)
  12:  {
  13:      if (NetworkInformation.GetInternetConnectionProfile() == null)
  14:      {
  15:          NetworkAvailable = false;
  16:      }
  17:      else
  18:      {
  19:          NetworkAvailable = true;
  20:      }
  21:  }

De esta forma en cualquier parte de nuestra aplicación, normalmente en una viewmodel que vaya a realizar una llamada de algún tipo a un servicio externo, podremos comprobar si tenemos o no internet y avisar al usuario sin necesidad de invertir tiempo en una llamada que va a fallar de antemano.

Un pequeño bug

Aunque todavía lo estoy investigando, he decidido comentarlo aquí, pues ya he podido reproducirlo en varios equipos distintos con la release preview y sería interesante saber si alguien más se encuentra con el mismo problema. El código que he enseñado anteriormente se encuentra en la clase App de la aplicación, si en cualquier punto de esta clase introducimos un MessageDialog, algo así por ejemplo:

   1:  async void NetworkInformation_NetworkStatusChanged(object sender)
   2:  {
   3:      MessageDialog dialog = new MessageDialog("Test");
   4:      var result = await dialog.ShowAsync();
   5:  }

E intentamos ejecutar la aplicación, al desconectar la red y ejecutarse el evento obtendremos el siguiente error:

image

Este mismo código, colocado en cualquier otro lugar fuera de la clase App funciona correctamente, además he podido probarlo en un Visual Studio 11 Beta sobre una consumer preview y no ocurría. Si alguien más puede reproducirlo sería de gran ayuda.

Accediendo a datos “en la nube”

Cuando accedemos a datos en internet estos pueden venir dados por un servicio REST, un servicio SOAP, datos en XML… multitud de formas diferentes de acceder a ellos. Una de las formas más sencillas es el consumir una fuente XML, de un Rss por ejemplo.

En Windows Phone podíamos usar la clase WebClient o HttpWebRequest para obtener un xml de Rss y luego procesarlo, en WinRT tenemos la clase HttpClient, del namespace System.Net.Http, que nos permite realizar la misma tarea, pero con el añadido de poder usar async / await para consumirla de forma más sencilla y sin pelearnos con los callbacks:

   1:  private async void GetRss()
   2:  {
   3:      HttpClient client = new HttpClient();
   4:   
   5:      var response = await client.GetAsync("http://geeks.ms/blogs/jyeray/rss.aspx");
   6:   
   7:      string docString = await response.Content.ReadAsStringAsync();
   8:   
   9:      if (!string.IsNullOrEmpty(docString))
  10:      {
  11:          //...
  12:      }
  13:  }

El método GetAsync nos devuelve una instancia de HttpResponseMessage, de la cual podemos obtener la cadena de texto con el contenido de la respuesta, que en este caso será el XML de nuestro Rss que podremos procesar de forma normal usando LinqToXML y XDocument para recorrerlo y convertir el XML en instancias de clases que podamos consumir.

Otro tipo de servicio muy sencillo de consumir es un servicio WCF, como siempre en Visual Studio, simplemente debemos hacer botón derecho sobre nuestro proyecto, escoger la opción “Add Service Reference” e introducir la url del servicio o hacer click en Discover si lo tenemos en nuestra misma solución:

image

La mayor novedad podemos encontrarla al presionar “Advanced”:

image

Como vemos en la primera parte de la pantalla, por defecto tenemos marcado el check de operaciones asíncronas y en concreto que se generen basadas en Task, es decir, para usar el modelo de Async. si presionamos OK en ambas pantallas y vamos al archivo reference.cs, localizado dentro de la referencia de nuestro servicio:

image

Veremos que en la Interface de nuestro servicio tenemos definidos los métodos asíncronos, basados en Tasks:

   1:  public interface IService1 {
   2:          
   3:      [System.ServiceModel.OperationContractAttribute(Action="http://tempuri.org/IService1/GetData", ReplyAction="http://tempuri.org/IService1/GetDataResponse")]
   4:      System.Threading.Tasks.Task<string> GetDataAsync(int value);
   5:          
   6:      [System.ServiceModel.OperationContractAttribute(Action="http://tempuri.org/IService1/GetDataUsingDataContract", ReplyAction="http://tempuri.org/IService1/GetDataUsingDataContractResponse")]
   7:      System.Threading.Tasks.Task<win8services.SrvReference.CompositeType> GetDataUsingDataContractAsync(win8services.SrvReference.CompositeType composite);
   8:  }

Anteriormente, en la interface de nuestros servicios solo se definían los métodos Begin y End para nuestras operaciones, mientras que el método Async y el evento Completed se definían en la clase Client que implementaba la Interface. Esto daba lugar a que si deseábamos trabajar con la interface, principalmente para poder implementar un cliente “falso” para los test unitarios, teníamos que hacer un pequeño truco para incluir nuestros métodos Async y Completed. Como ahora los métodos asíncronos están definidos en la interface directamente, nos ahorramos este trabajo, pudiendo usarlos directamente desde la misma:

   1:  private async void GetData()
   2:  {
   3:      IService1 service = new Service1Client();
   4:      string response = await service.GetDataAsync(27);
   5:      MessageDialog dlg = new MessageDialog(response);
   6:      var result = await dlg.ShowAsync();
   7:  }

Esto nos permite pasar la interface como una dependencia de nuestra viewmodel por el constructor, de forma que en nuestros test podamos pasar un mock de la misma.

Conclusión

En WinRT se ha simplificado mucho el consumo de servicios WCF al exponer los métodos asíncronos directamente en la interface y también el consumo de otro tipo de datos y servicios mediante la clase HttpClient, sin tener que pelearnos con los callbacks. Esta es una parte esencial de casi toda aplicación moderna, la comunicación con “el mundo exterior”, además el poder tener en todo momento conocimiento del estado de la red nos permite adelantarnos a fallos y dar al usuario información muy útil para su trabajo.

Como ya es costumbre, aquí os dejo el ejemplo de hoy para que podáis jugar con el y tenerlo como referencia.

Un saludo y Happy Coding!

[Windows 8] Apps Metro para desarrolladores Windows Phone 7.5 (8 de N)

Hola a todos!

Este viernes hemos recibido la release preview de Windows 8 y la release candidate de Visual Studio 2012, para no romper la buena tradición con las versiones beta, algunas cosas han cambiado entre la consumer preview y esta nueva release preview en cuanto a desarrollo de aplicaciones metro en C# y XAML.

Pero… ¿Quién dijo miedo? Me he sentado y he actualizado todas las entregas de esta serie de artículos para que funcionen correctamente en la Release Preview y en Visual Studio 2012 RC:

http://geeks.ms/blogs/jyeray/archive/tags/windows8/default.aspx

He actualizado los ejemplos y las explicaciones de algunas partes del código para que se adapten a las nuevas versiones. La mayoría de los cambios están relacionados con estilos y con la forma de gestionar los estados visuales de nuestra aplicación, Por el lado de los estilos lo más sencillo es crear un nuevo proyecto y ver los nuevos nombres de recursos y estilos que se usan. De hecho, puedes sustituir completamente el archivo standardstyles.xaml de la carpeta Commons por el de esta nueva aplicación y todo funcionará genial.

En cuanto a los estados visuales, ya no tenemos un método GetForCurrentView en la clase ApplicationView y lo suplimos subscribiéndonos al evento SizeChanged de nuestra ventana.

Bueno, lo mejor es que reviséis los artículos y actualicéis el código que os hayáis descargado con las nuevas versiones que he subido.

En breve, más cosas interesantes sobre Windows 8.

Un saludo y Happy coding!