MSDN España

Noticias, avisos, reflexiones... del equipo que hay detrás de MSDN en España... también tendremos alguna que otra firma invitada :)

Windows Phone Tips & Tricks. Cómo asociar tu aplicación a un protocolo

Windows Phone Tips & Tricks. Cómo asociar tu aplicación a un protocolo

[Nota: Este artículo pertenece a nuestra serie de Windows Phone Tips & Tricks]

Una de las formas que nos ofrece el SDK de Windows Phone 8 para comunicar nuestra app con otras es la asociación de protocolos. Para establecer esta comunicación necesitamos las dos partes: la aplicación que lanza el protocolo, y la aplicación que puede recibirlo y realizar alguna acción con él. Al asociar nuestra aplicación a un protocolo, esta se abrirá cuando otra aplicación lance este protocolo URI, y realizará las acciones que se hayan definido. La URI de un protocolo tiene la siguiente estructura:

<nombre_del_protocolo>:<parámetros>

Donde nosotros definimos el nombre del protocolo (antes de los dos puntos) y los diferentes parámetros que puede contener para realizar las acciones deseadas (podemos definir lo que queramos en esta parte).

Para asociar nuestra aplicación a un protocolo, debemos modificar el archivo WMAppManifest.xml de nuestro proyecto, utilizando el editor de XML, y crear justo detrás de la sección Tokens (o modificar, si ya existe) la
sección Extensions, dentro de la cual declararemos los protocolos a los que está asociada nuestra aplicación:

<Extensions>
     <Protocol Name=”basketbappTaskID=”_defaultNavUriFragment=”encodedLaunchUri=%s/>
</Extensions>

Para controlar las acciones que realizará nuestra aplicación al ser lanzada mediante el protocolo asociado, tenemos que crearnos nuestro UriMapper personalizado:

public class ProtocolUriMapper : UriMapperBase
{
    public override Uri MapUri(Uri uri)
    {
        string protocolURI = HttpUtility.UrlDecode(uri.ToString());
        
        // Comprobamos que parametros contiene la URI
        if (protocolURI.Contains("basketbapp:ShowTeams"))
        {
            string navigationUri = string.Format(@"/TeamsView.xaml?protocol={0}", 
						HttpUtility.UrlEncode(protocolURI));
            return new Uri(navigationUri, UriKind.Relative);
        }
        // Un caso por cada parametro que podamos recibir
        else if (protocolURI.Contains("basketbapp:ShowPlayers"))
        {
            string navigationUri = string.Format(@"/PlayersView.xaml?protocol={0}", 
						HttpUtility.UrlEncode(protocolURI));
            return new Uri(navigationUri, UriKind.Relative);
        }
        return uri;
    }
}

También debemos definir, en el método InitializePhoneApplication de App.xaml.cs, el uso de este UriMapper:

private void InitializePhoneApplication()
{
    if (phoneApplicationInitialized)
    return;
             
    RootFrame = new PhoneApplicationFrame();
    // Establecemos el uso de nuestro UriMapper personalizado
    RootFrame.UriMapper = new ProtocolUriMapper();
     
    //..
}

Y en el OnNavigatedTo de las páginas a las que se navegue al recibir el protocolo:

protected override void OnNavigatedTo(NavigationEventArgs e)
{
      // Visualizamos la URI del protocolo
      this.protocolTextBlock.Text = NavigationContext.QueryString["protocol"];
}

 

Para comprobar el funcionamiento de esta asociación de protocolos, lanzamos la URI de nuestro protocolo desde otra app:

await Windows.System.Launcher.LaunchUriAsync(new Uri("basketbapp:ShowPlayers"));

 

Este proceso es necesario para asociar nuestra aplicación con protocolos personalizados, existe una lista de protocolos reservados los cuales solo necesitan ser lanzados y el sistema se encarga de manejar, por ejemplo:

await Windows.System.Launcher.LaunchUriAsync(new Uri(“http://blogs.msdn.com/b/esmsdn/”));

Que abriría la URL del blog de MSDN España en el navegador. Puedes consultar esa lista de protocolos reservados aquí.

Si tienes alguna duda, recuerda que tienes a tu disposición el foro de desarrollo de aplicaciones para Windows Phone en castellano, donde podrás compartir tus conocimientos con la comunidad de desarrolladores y encontrar
ayuda para resolver tus dudas técnicas.

También puedes estar al día de todas las novedades a través de nuestros rincones en las redes sociales:

 

Un saludo,

      Gorka Madariaga (@Gk_8)