Iniciar um app em um dispositivo remotoLaunch an app on a remote device

Este artigo explica como iniciar um aplicativo do Windows em um dispositivo remoto.This article explains how to launch a Windows app on a remote device.

A partir do Windows 10, versão 1607, um aplicativo UWP pode iniciar um aplicativo UWP ou um aplicativo da área de trabalho do Windows remotamente em outro dispositivo que também executa o Windows 10, versão 1607 ou posterior, desde que ambos os dispositivos sejam conectados com a mesma conta da 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). Esse é o caso de uso mais simples do Project Rome.This is the simplest use case of Project Rome.

O recurso de inicialização remota proporciona experiências de usuário orientadas à tarefa, em que um usuário pode iniciar uma tarefa em um dispositivo e concluí-la em outro.The remote launch feature enables task-oriented user experiences; a user can start a task on one device and finish it on another. Por exemplo, se o usuário estiver ouvindo música pelo telefone no seu carro, ele pode transferir a funcionalidade de reprodução para o Xbox One quando chegar em 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. A inicialização remota permite que os aplicativos passem dados contextuais para o app remoto que será iniciado para retomar a tarefa de onde ela foi interrompida.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.

Configuração preliminarPreliminary setup

Adicionar funcionalidade remoteSystemAdd the remoteSystem capability

Para seu app iniciar um app em um dispositivo remoto, você deve adicionar a funcionalidade remoteSystem ao manifesto do pacote do aplicativo.In order for your app to launch an app on a remote device, you must add the remoteSystem capability to your app package manifest. Você pode usar o designer de manifesto de pacote para adicioná-lo selecionando sistema remoto na guia recursos ou pode adicionar manualmente a seguinte linha ao arquivo Package. appxmanifest do seu projeto.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>

Habilite compartilhamento entre dispositivosEnable cross-device sharing

Além disso, o dispositivo cliente deve ser definido para permitir o compartilhamento entre dispositivos.Additionally, the client device must be set to allow cross-device sharing. Essa configuração, que é acessada em Configurações: Sistema > Experiências compartilhadas > Compartilhar em todos os dispositivos, é habilitada por padrão.This setting, which is accessed in Settings: System > Shared experiences > Share across devices, is enabled by default.

página de configuração de experiências compartilhadas

Localizar um dispositivo remotoFind a remote device

Primeiro você deve localizar o dispositivo ao qual deseja se conectar.You must first find the device that you want to connect with. Descobrir dispositivos remotos descreve em detalhes como fazer isso.Discover remote devices discusses how to do this in detail. Vamos usar uma abordagem simples aqui que omite a filtragem por tipo de dispositivo ou conectividade.We'll use a simple approach here that forgoes filtering by device or connectivity type. Criaremos um inspetor de sistema remoto que procura por dispositivos remotos e grava manipuladores dos eventos que são acionados quando dispositivos são descobertos ou removidos.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. Isso nos fornecerá uma coleção de dispositivos remotos.This will provide us with a collection of remote devices.

O código nestes exemplos exige que você tenha uma instrução using Windows.System.RemoteSystems no(s) seu(s) arquivo(s) de classe.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();
    }
}

A primeira coisa que você deve fazer antes de fazer uma inicialização remota é chamar RemoteSystem.RequestAccessAsync().The first thing you must do before making a remote launch is call RemoteSystem.RequestAccessAsync(). Verifique o valor de retorno para confirmar se seu aplicativo tem permissão para acessar dispositivos remotos.Check the return value to make sure your app is allowed to access remote devices. Uma razão para essa verificação falhar seria você não ter adicionado a funcionalidade remoteSystem ao seu aplicativo.One reason this check could fail is if you haven't added the remoteSystem capability to your app.

Os manipuladores de eventos do inspetor de sistema são chamados quando um dispositivo ao qual nos conectamos é descoberto ou não está mais disponível.The system watcher event handlers are called when a device that we can connect with is discovered or is no longer available. Usaremos esses manipuladores de eventos para manter uma lista atualizada de dispositivos ao quais podemos nos 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);
}

Rastrearemos os dispositivos por ID de sistema remoto usando um Dicionário.We will track the devices by remote system ID using a Dictionary. Uma ObservableCollection é usada para manter a lista de dispositivos que podemos enumerar.An ObservableCollection is used to hold the list of devices that we can enumerate. Uma ObservableCollection também torna fácil associar a lista de dispositivos à interface do usuário, mas não faremos isso neste exemplo.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>();

Adicione uma chamada para BuildDeviceList() no código de inicialização do aplicativo antes de tentar iniciar um aplicativo remoto.Add a call to BuildDeviceList() in your app startup code before you attempt to launch a remote app.

Iniciar um app em um dispositivo remotoLaunch an app on a remote device

Inicie um app remotamente passando o dispositivo ao qual você deseja se conectar à API RemoteLauncher.LaunchUriAsync.Launch an app remotely by passing the device you wish to connect with to the RemoteLauncher.LaunchUriAsync API. Há três sobrecargas para esse método.There are three overloads for this method. A mais simples, que este exemplo demonstra, especifica o URI que ativará o app no dispositivo remoto.The simplest, which this example demonstrates, specifies the URI that will activate the app on the remote device. Neste exemplo o URI abre o aplicativo Mapas no computador remoto com uma exibição 3D do Space Needle.In this example the URI opens the Maps app on the remote machine with a 3D view of the Space Needle.

Outras sobrecargas RemoteLauncher.LaunchUriAsync permitem especificar opções como o URI do site para visualizar se nenhum app adequado pode ser iniciado no dispositivo remoto e uma lista opcional de nomes da família de pacotes que pode ser usada para iniciar o URI no 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. Você também pode fornecer dados na forma de pares chave/valor.You can also provide data in the form of key/value pairs. Você pode passar dados ao app que está ativando para fornecer contexto para o app remoto, como o nome da música a ser reproduzida e o local de reprodução atual ao transferir a reprodução de um dispositivo para outro.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.

Em cenários práticos, você pode fornecer a interface do usuário para selecionar o dispositivo de destino.In practical scenarios, you might provide UI to select the device you want to target. Mas, para simplificar este exemplo, usaremos apenas o primeiro dispositivo remoto da 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"));
}

O objeto RemoteLaunchUriStatus retornado de RemoteLauncher.LaunchUriAsync() fornece informações sobre o êxito da inicialização remota e, em caso negativo, o motivo.The RemoteLaunchUriStatus object that is returned from RemoteLauncher.LaunchUriAsync() provides information about whether the remote launch succeeded, and if not, the reason why.

Referência de API de sistemas remotosRemote Systems API reference
Visão geral de aplicativos e dispositivos conectados (projeto Roma)Connected apps and devices (Project Rome) overview
Descobrir dispositivos remotosDiscover remote devices
Exemplo de sistemas remotos demonstra como descobrir um sistema remoto, iniciar um apps em um sistema remoto e usar os serviços de apps para enviar mensagens entre apps em execução em dois 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.