Iniciar una aplicación en un dispositivo remoto

Este artículo explica cómo iniciar una aplicación de Windows en un dispositivo remoto.

A partir de Windows 10, versión 1607, una aplicación para UWP puede iniciar una aplicación para UWP o una aplicación de escritorio de Windows remotamente en otro dispositivo que también esté ejecutando Windows 10, versión 1607 o posterior, siempre que ambos dispositivos hayan iniciado sesión con la misma cuenta de Microsoft (MSA). Este es el caso de uso más sencillo de Project Rome.

La característica de inicio remoto permite experiencias de usuario orientadas a tareas; un usuario puede iniciar una tarea en un dispositivo y finalizarla en otra. Por ejemplo, si el usuario escucha música en su teléfono en su automóvil, entonces podría entregar la funcionalidad de reproducción a su Xbox One cuando llegue a casa. El inicio remoto permite a las aplicaciones pasar datos contextuales a la aplicación remota que se está iniciando, con el fin de recoger dónde se dejó la tarea.

Configuración preliminar

Agregar la funcionalidad remoteSystem

Para que la aplicación pueda iniciar una aplicación en un dispositivo remoto, debes agregar la funcionalidad remoteSystem al manifiesto del paquete de la aplicación. Puede usar el diseñador de manifiestos de paquete para agregarlo seleccionando Sistema remoto en la pestaña Capacidades , o bien puede agregar manualmente la siguiente línea al archivo Package.appxmanifest del proyecto.

<Capabilities>
   <uap3:Capability Name="remoteSystem"/>
</Capabilities>

Habilitación del uso compartido entre dispositivos

Además, el dispositivo cliente debe establecerse para permitir el uso compartido entre dispositivos. Esta configuración, a la que se accede en Configuración: Lasexperiencias> compartidas del sistema>Compartir entre dispositivos están habilitadas de forma predeterminada.

página de configuración de experiencias compartidas

Buscar un dispositivo remoto

En primer lugar, debes buscar el dispositivo al que quieres conectarte. Discover remote devices describe cómo hacerlo de manera detallada. Usaremos un enfoque sencillo que renuncia al filtro por tipo de dispositivo o de conectividad. Crearemos un monitor de sistema remoto que busque dispositivos remotos y escribiremos controladores para los eventos que se generen cuando se detecten o se quiten dispositivos. Esto nos proporcionará una colección de dispositivos remotos.

El código de estos ejemplos requiere que tenga una using Windows.System.RemoteSystems instrucción en los archivos de clase.

private async Task BuildDeviceList()
{
    RemoteSystemAccessStatus accessStatus = await RemoteSystem.RequestAccessAsync();

    if (accessStatus == RemoteSystemAccessStatus.Allowed)
    {
        m_remoteSystemWatcher = RemoteSystem.CreateWatcher();

        // Subscribing to the event raised when a new remote system is found by the watcher.
        m_remoteSystemWatcher.RemoteSystemAdded += RemoteSystemWatcher_RemoteSystemAdded;

        // Subscribing to the event raised when a previously found remote system is no longer available.
        m_remoteSystemWatcher.RemoteSystemRemoved += RemoteSystemWatcher_RemoteSystemRemoved;

        m_remoteSystemWatcher.Start();
    }
}

Lo primero que debes hacer antes de realizar un inicio remoto es llamar a RemoteSystem.RequestAccessAsync(). Comprueba el valor devuelto para asegurarte de que tu aplicación puede acceder a dispositivos remotos. Es posible que no se pueda realizar esta comprobación si no has agregado la funcionalidad remoteSystem a tu aplicación.

La llamada a los controladores de eventos del monitor de sistema tiene lugar cuando un dispositivo con el que nos podemos conectar se detecta o ya no está disponible. Usaremos estos controladores de eventos para mantener una lista actualizada de dispositivos con los que nos podemos conectar.

private void RemoteSystemWatcher_RemoteSystemRemoved(
    RemoteSystemWatcher sender, RemoteSystemRemovedEventArgs args)
{
    if ( m_deviceMap.ContainsKey(args.RemoteSystemId))
    {
        m_deviceList.Remove(m_deviceMap[args.RemoteSystemId]);
        m_deviceMap.Remove(args.RemoteSystemId);
    }
}

private void RemoteSystemWatcher_RemoteSystemAdded(
    RemoteSystemWatcher sender, RemoteSystemAddedEventArgs args)
{
    m_deviceList.Add(args.RemoteSystem);
    m_deviceMap.Add(args.RemoteSystem.Id, args.RemoteSystem);
}

Realizaremos un seguimiento de los dispositivos mediante el identificador del sistema remoto mediante un objeto Dictionary. ObservableCollection se usa para contener la lista de dispositivos que se pueden enumerar. Una observableCollection también facilita el enlace de la lista de dispositivos a la interfaz de usuario, aunque no lo haremos en este ejemplo.

private RemoteSystemWatcher m_remoteSystemWatcher;
private ObservableCollection<RemoteSystem> m_deviceList = new ObservableCollection<RemoteSystem>();
private Dictionary<string, RemoteSystem> m_deviceMap = new Dictionary<string, RemoteSystem>();

Agrega una llamada a BuildDeviceList() en el código de inicio de la aplicación antes de intentar iniciar una aplicación remota.

Iniciar una aplicación en un dispositivo remoto

Para iniciar una aplicación de forma remota, pasa el dispositivo al que quieres conectarte con la API RemoteLauncher.LaunchUriAsync. Hay tres sobrecargas para este método. La más simple, que se muestra en este ejemplo, especifica el URI que activará la aplicación en el dispositivo remoto. En este ejemplo, el URI abre la aplicación Mapas en el equipo remoto con una vista 3D de la torre Space Needle.

Otras sobrecargas de RemoteLauncher.LaunchUriAsync te permiten especificar opciones, como el URI del sitio web, para ver si en el dispositivo remoto no se puede iniciar ninguna aplicación que pueda controlar el URI, y una lista opcional de nombres de familia de paquete, que se podría usar para iniciar el URI en el dispositivo remoto. También puedes proporcionar datos en forma de pares clave-valor. Podrías pasar datos a la aplicación que estás activando para proporcionar contexto a la aplicación remota, como el nombre de la canción que se va a reproducir y la ubicación de reproducción actual al pasar la reproducción de un dispositivo a otro.

En casos prácticos, podrías proporcionar la interfaz de usuario para seleccionar el dispositivo al que quieres dirigirte. No obstante, para simplificar este ejemplo, solo usaremos el primer dispositivo remoto de la lista.

if ( m_deviceList.Count > 0)
{
    RemoteSystem SelectedDevice = m_deviceList[0];
    RemoteLaunchUriStatus launchUriStatus = 
        await RemoteLauncher.LaunchUriAsync(
            new RemoteSystemConnectionRequest(SelectedDevice), 
            new Uri("bingmaps:?cp=47.6204~-122.3491&sty=3d&rad=200&pit=75&hdg=165"));
}

El objeto RemoteLaunchUriStatus que se devuelve de RemoteLauncher.LaunchUriAsync() indica si el inicio remoto se ha realizado correctamente y, si no es así, la causa.

Referencia de API de sistemas remotos
Introducción a aplicaciones y dispositivos conectados (Project Rome)
Detectar dispositivos remotos
La muestra de sistemas remotos indica cómo detectar un sistema remoto, iniciar una aplicación en un sistema remoto y usar los servicios de aplicaciones para enviar mensajes entre aplicaciones que se ejecuten en dos sistemas.