[Windows Phone] Buscar por actualizaciones desde la propia App

WindowsPhoneStoreUpdateIntroducción

Al desarrollar aplicaciones tarde o temprano tendremos la necesidad de actualizarlas ya sea bien por necesidad, para corregir bugs, o bien para añadir nueva funcionalidad. En ambos casos, nuestro mayor interés es que la mayor cantidad de usuariosse actualice a la última versión. Sin embargo, esto no siempre sucede.

¿Por que?

Podemos arrojar varias posibles causas:

  • El usuario utiliza el móvil con internet de manera muy puntual.
  • No tiene la Store anclada al inicio y no se da cuenta de las actualizaciones.
  • No se preocupa de revisar las actualizaciones.
  • Directamente el usuario desconoce como realizar la acción.

Sin abrir la aplicación de la Store y sin tenerla anclada al inicio puede provocar que los usuarios tengan aplicaciones sin actualizar a la última versión, no disfrutando de mejoras y lo que es peor sufriendo bugs que incluso pueden estar resueltos en versiones posteriores.

Para mejorar esta situación podemos indicarle al usuario de la disponibilidad de una actualización disponible. Pero… ¿cómo detectamos desde nuestra aplicación de la existencia de una actualización?

Cimbalino al rescate

Cimbalino Windows Phone Toolkit es un completo conjunto de herramientas destinadas a ahorrarnos tiempo y esfuerzo al desarrollar aplicaciones para Windows Phone del que ya hablamos previamente. Entre el conjunto de posibilidades que nos brinda, nos ofrece un servicio llamado IMarketplaceInformationService que nos permite verificar la existencia de actualizaciones de la aplicación dentro de la misma. Vamos a crear una Aplicación de ejemplo para utilizar el Toolkit y poder verificar la existencia de actualizaciones:

Tras crear el proyecto, comenzamos añadiendo el Toolkit. Tenemos disponible Cimbalino en NuGet por lo que podemos instalarlo usando Nuget Package Manager.

En las referencias del proyecto hacemos clic derecho y seleccionamos la opción Manage NuGet Packages …

Ejemplo Cimbalino 01
Manage NuGet Packages …

En la ventana modal que nos aparece, en la parte superior derecha donde podemos realizar una búsqueda, buscamos por «cimbalino»:

Ejemplo Cimbalino 02

Seleccionamos el primero de los elementos y pulsamos el botón Install. Tras un breve periodo donde se procede a descargar e incluir las librerías en las referencias del proyecto, tendremos el siguiente resultado:

Ejemplo Cimbalino 03
Librerías instaladas y listas para usar

Ya con la librería instalada podemos continuar con nuestro objetivo. Comenzamos definiendo la interfaz del ejemplo. En nuestro caso colocaremos un botón en la interfaz para verificar la existencia de actualizaciones. Sin embargo, la verificamos se puede realizar perfectamente en el arranque de la aplicación.

<Button Content="Buscar Actualizaciones"/>

Le añadimos un comando a ejecutar al ser pulsado:

<Button Content="Buscar Actualizaciones" Command="{Binding ChechForUpdatesCommand}" Height="100" VerticalAlignment="Center"/>

En el ViewModel correspondiente a la interfaz contaremos con el comando:

private ICommand _chechForUpdatesCommand;

public ICommand ChechForUpdatesCommand
{
     get { return _chechForUpdatesCommand = _chechForUpdatesCommand ?? new DelegateCommand(ChechForUpdatesCommandDelegate); }
}

public void ChechForUpdatesCommandDelegate()
{

}

Para utilizar el servicio IMarketplaceInformationService en la acción de nuestro comando necesitamos inyectar el servicio. Los servicios asi como la propia ViewModel no se creará manualmente sino que se resolverá automáticamente en tiempo de ejecución por el contenedor de dependencia. En el contenedor utilizaremos Unity (proyecto Open Source de Microsoft) para soportar la inyección de dependencias:

public Container()
{
     _currentContainer = new UnityContainer();

     //Servicios
     _currentContainer.RegisterType<IMarketplaceInformationService, MarketplaceInformationService>();
     _currentContainer.RegisterType<IMessageBoxService, MessageBoxService>();
     _currentContainer.RegisterType<IMarketplaceDetailService, MarketplaceDetailService>();

     //Vistas
     _currentContainer.RegisterType<MainViewModel>(new ContainerControlledLifetimeManager());
}

En el punto de entrada de la ViewModel (el contructor) inyectaremos los servicios necesarios previamente registrados en el contenedor:

public MainViewModel(IMarketplaceInformationService marketplaceInformationService, IMessageBoxService messageBoxService,
IMarketplaceDetailService marketplaceDetailService)<br />
{
     _marketplaceInformationService = marketplaceInformationService;
     _messageBoxService = messageBoxService;
     _marketplaceDetailService = marketplaceDetailService;
}

Con el servicio disponible, verificaremos la versión de la aplicación (por reflection):

var data = new AssemblyName(Assembly.GetExecutingAssembly().FullName);
var currentVersion = data.Version;

Y la compararemos con la versión disponible en la Store:

Version updatedVersion;
Version.TryParse(node.Entry.Version, out updatedVersion);

Para obtener la versión de la Store utilizaremos el método GetAppInformation del cual también tenemos versión asíncrona del servicio MarketPlaceInformationService.

En el resultado obtenido por la petición podemos obtener una enorme cantidad de la información relacionada con la apliación publicada en la Store:

  • Título
  • Versión
  • Publicador
  • Icono
  • Fotos
  • Fecha de publicación
  • Puntuaciones

Por lo que el servicio puede ser utilizado para una enorme variedad de situaciones con información relevante del estado de la apliación en la Store.

Comparamos versiones, si la actual es superior a la de la Store, tenemos actualización disponible. Utilizamos el servicio MessageBoxService de Cimbalino para notificar al usuario:

if (updatedVersion > currentVersion
&& _messageBoxService.Show(Resources.AppResources.DownloadUpdate, Resources.AppResources.UpdateAvalaible, MessageBoxButton.OKCancel) == MessageBoxResult.OK)
{

}

Por último, si el usuario desea abriremos la Store directamente con la apliación para que solo tenga que pulsar un botón para actualizar. Para ello usaremos otro servicio de Cimbalino, MarketPlaceReviewService:

_marketplaceDetailService.Show(ProductId);

NOTA: Dado que la aplicación de ejemplo no esta en la Store, para este ejemplo hemos utilizado una aplicación ya publicada en la Store en concreto Dev Center que va por su versión 1.4.1312.4.

Fácil, ¿verdad?. Tenemos disponible el ejemplo realizado a continuación:

Más información

Un pensamiento en “[Windows Phone] Buscar por actualizaciones desde la propia App

  1. Pingback: Tips & Tricks de desarrollo para Windows Phone - MSDN España - Site Home - MSDN Blogs

Deja un comentario