[Windows Phone] Buscar por actualizaciones desde la propia App

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

Deja un comentario

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