Introducció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 …

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

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:

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