Windows Phone Tips & Tricks. Cómo actualizar el Live Tile principal de mi app

[Nota: Este artículo pertenece a la serie de Windows Phone Tips & Tricks de MSDN España]

Hola,

Como a lo mejor habrás visto en otros Tips & Tricks que he escrito para Windows Phone (este, este o este, por ejemplo), acostumbro a encapsular todo el código dependiente de la plataforma en clases genéricas que puedo fácilmente reutilizar y sustituir, algo muy útil por ejemplo cuando usamos MVVM en nuestras apps (como en este ejemplo).

Para actualizar el live tile principal de una app hecha para Windows Phone 8, utilizo una clase como esta:

using Microsoft.Phone.Shell;
using System;
using System.Linq;

namespace MyApp.Services
{
    // Manejo del Live Tile
    public class LiveTileService
    {
        // Título
        public string Title { get; set; }
        public string BackTitle { get; set; }

        // Contador
        public int Count { get; set; }

        // Texto
        public string BackContent { get; set; }
        public string WideBackContent { get; set; }

        // Imágenes
        public string BackgroundImagePath { get; set; }
        public string BackBackgroundImagePath { get; set; }
        public string SmallBackgroundImagePath { get; set; }
        public string WideBackgroundImagePath { get; set; }
        public string WideBackBackgroundImagePath { get; set; }

        // Constructor
        public LiveTileService()
        {
        }

        // Actualiza el live tile de la app
        public void UpdateTile()
        {
            // Rellena la plantilla
            FlipTileData tileData = new FlipTileData
            {
                Title = this.Title ?? "",
                BackTitle = this.BackTitle ?? "",
                Count = this.Count,
                BackContent = this.BackContent ?? "",
                WideBackContent = this.WideBackContent ?? "",
                BackgroundImage = new Uri(this.BackgroundImagePath ?? "", UriKind.Relative),
                BackBackgroundImage = new Uri(this.BackBackgroundImagePath ?? "", UriKind.Relative),
                SmallBackgroundImage = new Uri(this.SmallBackgroundImagePath ?? "", UriKind.Relative),
                WideBackgroundImage = new Uri(this.WideBackgroundImagePath ?? "", UriKind.Relative),
                WideBackBackgroundImage = new Uri(this.WideBackBackgroundImagePath ?? "", UriKind.Relative)
            };

            // Actualiza el live tile con la plantilla
            ShellTile.ActiveTiles.FirstOrDefault().Update(tileData);
        }
    }
}

Y si lo quiero hacer para una app hecha para Windows Phone 7.5 utilizo una clase como esta:

using Microsoft.Phone.Shell;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Reflection;

namespace MyApp.Services
{
    // Manejo del Live Tile
    public class LiveTileService
    {
        // Título
        public string Title { get; set; } // WP7, WP8
        public string BackTitle { get; set; } // WP7, WP8

        // Contador
        public int Count { get; set; } // WP7, WP8

        // Texto
        public string BackContent { get; set; } // WP7, WP8
        public string WideBackContent { get; set; } // WP8

        // Imágenes
        public string BackgroundImagePath { get; set; } // WP7, WP8
        public string BackBackgroundImagePath { get; set; } // WP7, WP8
        public string SmallBackgroundImagePath { get; set; } // WP8
        public string WideBackgroundImagePath { get; set; } // WP8
        public string WideBackBackgroundImagePath { get; set; } // WP8

        // Constructor
        public LiveTileService()
        {
        }

        // Actualiza el live tile de la app
        public void UpdateTile()
        {
            if (IsWp8)
            {
                // Si el usuario está en Windows Phone 8, actualiza el live tile por Reflection

                // Rellena la plantilla
                Type flipTileDataType = Type.GetType("Microsoft.Phone.Shell.FlipTileData, Microsoft.Phone");
                var tileData = Activator.CreateInstance(flipTileDataType);
                SetProperty(tileData, "Title", this.Title ?? "");
                SetProperty(tileData, "BackTitle", this.BackTitle ?? "");
                SetProperty(tileData, "Count", this.Count);
                SetProperty(tileData, "BackContent", this.BackContent ?? "");
                SetProperty(tileData, "WideBackContent", this.WideBackContent ?? "");
                SetProperty(tileData, "BackgroundImage", new Uri(this.BackgroundImagePath ?? "", UriKind.Relative));
                SetProperty(tileData, "BackBackgroundImage", new Uri(this.BackBackgroundImagePath ?? "", UriKind.Relative));
                SetProperty(tileData, "SmallBackgroundImage", new Uri(this.SmallBackgroundImagePath ?? "", UriKind.Relative));
                SetProperty(tileData, "WideBackgroundImage", new Uri(this.WideBackgroundImagePath ?? "", UriKind.Relative));
                SetProperty(tileData, "WideBackBackgroundImage", new Uri(this.WideBackBackgroundImagePath ?? "", UriKind.Relative));

                // Actualiza el live tile con la plantilla
                Type shellTileType = typeof(ShellTile);
                PropertyInfo activeTilesProp = shellTileType.GetProperty("ActiveTiles");
                IEnumerable<ShellTile> tiles = activeTilesProp.GetValue(activeTilesProp, null) as IEnumerable<ShellTile>;
                MethodInfo updateMethod = shellTileType.GetMethod("Update", new Type[] { typeof(ShellTileData) });
                updateMethod.Invoke(tiles.FirstOrDefault(), new object[] { tileData });
            }
            else
            {
                // Si el usuario está en Windows Phone 7, actualiza el live tile de manera normal

                // Rellena la plantilla
                StandardTileData tileData = new StandardTileData
                {
                    Title = this.Title ?? "",
                    Count = this.Count,
                    BackTitle = this.BackTitle ?? "",
                    BackContent = this.BackContent ?? "",
                    BackgroundImage = new Uri(this.BackgroundImagePath ?? "", UriKind.Relative),
                    BackBackgroundImage = new Uri(this.BackBackgroundImagePath ?? "", UriKind.Relative)
                };

                // Actualiza el live tile con la plantilla
                ShellTile.ActiveTiles.FirstOrDefault().Update(tileData);
            }
        }

        // Detecta si la app está ejecutándose en un Windows Phone 8
        private bool IsWp8 { get { return Environment.OSVersion.Version >= new Version(8, 0); } }

        // Da un valor a una propiedad por Reflection
        private void SetProperty(object instance, string name, object value)
        {
            MethodInfo setMethod = instance.GetType().GetProperty(name).GetSetMethod();
            setMethod.Invoke(instance, new object[] { value });
        }
    }
}

Como puedes ver esta última clase detecta si nuestra app de Windows Phone 7.5 se está ejecutando en un Windows Phone 8. Si no es así, actualiza el live tile de la manera tradicional en Windows Phone 7.5. Pero si se ejecuta en Windows Phone 8, gracias al mecanismo de reflexión (Reflection) de .NET la app puede hacer uso de las nuevas plantillas de live tile y definir el aspecto que tendrán sus diferentes tamaños (recuerda que ahora en la versión 8 tenemos live tiles pequeños, normales y anchos), al igual que lo hacemos en las apps de Windows Phone 8 sin necesidad de reflexión. Esto también nos valdría si ejecutamos la app en Windows Phone 7.8, lo único que en lugar de comprobar si la versión del sistema operativo es Version(8, 0) o superior, según la documentación para que también tenga en cuenta Windows Phone 7.8 tenemos que comprobar si la versión es Version(7, 10, 8858) o superior.

Espero que te sea de utilidad.

Un saludo,

Alejandro Campos Magencio (@alejacma)

PD: Mantente informado de todas las novedades de Microsoft para los desarrolladores españoles a través del Twitter de MSDN, el Facebook de MSDN, el Blog de MSDN y la Newsletter MSDN Flash.

About these ads

Un pensamiento en “Windows Phone Tips & Tricks. Cómo actualizar el Live Tile principal de mi app

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

Deja un comentario

Introduce tus datos o haz clic en un icono para iniciar sesión:

Logo de WordPress.com

Estás comentando usando tu cuenta de WordPress.com. Cerrar sesión / Cambiar )

Imagen de Twitter

Estás comentando usando tu cuenta de Twitter. Cerrar sesión / Cambiar )

Foto de Facebook

Estás comentando usando tu cuenta de Facebook. Cerrar sesión / Cambiar )

Google+ photo

Estás comentando usando tu cuenta de Google+. Cerrar sesión / Cambiar )

Conectando a %s