Iniciar una aplicación en un dispositivo remotoLaunch an app on a remote device

Este artículo explica cómo iniciar una aplicación de Windows en un dispositivo remoto.This article explains how to launch a Windows app on a remote device.

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).Starting in Windows 10, version 1607, a UWP app can launch a UWP app or Windows desktop application remotely on another device that is also running Windows 10, version 1607 or later, provided that both devices are signed on with the same Microsoft Account (MSA). Este es el caso de uso más sencillo del proyecto Roma.This is the simplest use case of Project Rome.

La característica de inicio remoto habilita experiencias de usuario orientadas a tareas; un usuario puede iniciar una tarea en un dispositivo y finalizarla en otro.The remote launch feature enables task-oriented user experiences; a user can start a task on one device and finish it on another. Por ejemplo, si el usuario está escuchando música en su teléfono en su coche, podría controlar la funcionalidad de reproducción a su Xbox One cuando lleguen a casa.For example, if the user is listening to music on their phone in their car, they could then hand playback functionality over to their Xbox One when they arrive at home. El inicio remoto permite que las aplicaciones pasen datos contextuales a la aplicación remota que se está iniciando, con el fin de recoger dónde se dejó la tarea.Remote launch allows apps to pass contextual data to the remote app being launched, in order to pick up where the task was left off.

Configuración preliminarPreliminary setup

Agregar la funcionalidad remoteSystemAdd the remoteSystem capability

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.In order for your app to launch an app on a remote device, you must add the remoteSystem capability to your app package manifest. Puede usar el diseñador de manifiestos de paquete para agregarlo seleccionando sistema remoto en la pestaña capacidades , o puede Agregar manualmente la siguiente línea al archivo Package. appxmanifest del proyecto.You can use the package manifest designer to add it by selecting Remote System on the Capabilities tab, or you can manually add the following line to your project's Package.appxmanifest file.

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

Habilitar el uso compartido entre dispositivosEnable cross-device sharing

Además, el dispositivo cliente debe estar configurado para permitir el uso compartido entre dispositivos.Additionally, the client device must be set to allow cross-device sharing. Esta configuración, a la que se tiene acceso en configuración: el uso compartido de System > experiencias compartidasdel sistema > entre dispositivos, está habilitado de forma predeterminada.This setting, which is accessed in Settings: System > Shared experiences > Share across devices, is enabled by default.

Página de configuración de experiencias compartidas

Buscar un dispositivo remotoFind a remote device

En primer lugar, debes buscar el dispositivo al que quieres conectarte.You must first find the device that you want to connect with. Discover remote devices describe cómo hacerlo de manera detallada.Discover remote devices discusses how to do this in detail. Usaremos un enfoque sencillo que renuncia al filtro por tipo de dispositivo o de conectividad.We'll use a simple approach here that forgoes filtering by device or connectivity type. 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.We will create a remote system watcher that looks for remote devices, and write handlers for the events that are raised when devices are discovered or removed. Esto nos proporcionará una colección de dispositivos remotos.This will provide us with a collection of remote devices.

El código de estos ejemplos requiere que tenga una using Windows.System.RemoteSystems instrucción en los archivos de clase.The code in these examples requires that you have a using Windows.System.RemoteSystems statement in your class file(s).

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().The first thing you must do before making a remote launch is call RemoteSystem.RequestAccessAsync(). Comprueba el valor devuelto para asegurarte de que tu aplicación puede acceder a dispositivos remotos.Check the return value to make sure your app is allowed to access remote devices. Es posible que no se pueda realizar esta comprobación si no has agregado la funcionalidad remoteSystem a tu aplicación.One reason this check could fail is if you haven't added the remoteSystem capability to your app.

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.The system watcher event handlers are called when a device that we can connect with is discovered or is no longer available. Usaremos estos controladores de eventos para mantener una lista actualizada de dispositivos con los que nos podemos conectar.We will use these event handlers to keep an updated list of devices that we can connect to.

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.We will track the devices by remote system ID using a Dictionary. Un ObservableCollection se usa para contener la lista de dispositivos que se pueden enumerar.An ObservableCollection is used to hold the list of devices that we can enumerate. Un ObservableCollection también facilita el enlace de la lista de dispositivos a la interfaz de usuario, aunque no lo haremos en este ejemplo.An ObservableCollection also makes it easy to bind the list of devices to UI, though we won't do that in this example.

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.Add a call to BuildDeviceList() in your app startup code before you attempt to launch a remote app.

Iniciar una aplicación en un dispositivo remotoLaunch an app on a remote device

Para iniciar una aplicación de forma remota, pasa el dispositivo al que quieres conectarte con la API RemoteLauncher.LaunchUriAsync.Launch an app remotely by passing the device you wish to connect with to the RemoteLauncher.LaunchUriAsync API. Hay tres sobrecargas para este método.There are three overloads for this method. La más simple, que se muestra en este ejemplo, especifica el URI que activará la aplicación en el dispositivo remoto.The simplest, which this example demonstrates, specifies the URI that will activate the app on the remote device. En este ejemplo, el URI abre la aplicación Mapas en el equipo remoto con una vista 3D de la torre Space Needle.In this example the URI opens the Maps app on the remote machine with a 3D view of the 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.Other RemoteLauncher.LaunchUriAsync overloads allow you to specify options such as the URI of the web site to view if no appropriate app can be launched on the remote device, and an optional list of package family names that could be used to launch the URI on the remote device. También puedes proporcionar datos en forma de pares clave-valor.You can also provide data in the form of key/value pairs. 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.You might pass data to the app you are activating to provide context to the remote app, such as the name of the song to play and the current playback location when you hand off playback from one device to another.

En casos prácticos, podrías proporcionar la interfaz de usuario para seleccionar el dispositivo al que quieres dirigirte.In practical scenarios, you might provide UI to select the device you want to target. No obstante, para simplificar este ejemplo, solo usaremos el primer dispositivo remoto de la lista.But to simplify this example, we'll just use the first remote device on the list.

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.The RemoteLaunchUriStatus object that is returned from RemoteLauncher.LaunchUriAsync() provides information about whether the remote launch succeeded, and if not, the reason why.

Referencia de API de sistemas remotosRemote Systems API reference
Información general sobre dispositivos y aplicaciones conectados (proyecto Roma)Connected apps and devices (Project Rome) overview
Detectar dispositivos remotosDiscover remote devices
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.Remote Systems sample demonstrates how to discover a remote system, launch an app on a remote system, and use app services to send messages between apps running on two systems.