Comunicar-se com um serviço de app remoto

Além de iniciar um app em um dispositivo remoto usando um URI, você também pode executar e se comunicar com serviços de app em dispositivos remotos. Qualquer dispositivo baseado no Windows pode ser usado como o dispositivo cliente ou host. Isso proporciona um número praticamente ilimitado de maneiras de interagir com dispositivos conectados sem a necessidade de trazer um app para o primeiro plano.

Configurar o serviço de app no dispositivo host

Para executar um serviço de app em um dispositivo remoto, você já deve ter um provedor desse serviço de app instalado no dispositivo. Este guia usará a versão CSharp do exemplo do serviço de aplicativo Gerador de Número Aleatório, disponível no repositório de exemplos universais do Windows. Para obter instruções sobre como criar seu próprio serviço de app, consulte Criar e consumir um serviço de app.

Se você estiver usando um serviço de aplicativo já criado ou estiver criando seu próprio serviço, precisará fazer algumas edições para tornar o serviço compatível com sistemas remotos. No Visual Studio, vá para o projeto do provedor de serviço (chamado de "AppServicesProvider" no exemplo) e selecione seu arquivo Package.appxmanifest. Clique com botão direito e selecione Exibir Código para exibir todo o conteúdo do arquivo. Crie um elemento Extensions dentro do elemento main Application (ou localize-o se ele já existir). Em seguida, crie uma Extensão para definir o projeto como um serviço de aplicativo e referenciar seu projeto pai.

...
<Extensions>
    <uap:Extension Category="windows.appService" EntryPoint="RandomNumberService.RandomNumberGeneratorTask">
        <uap3:AppService Name="com.microsoft.randomnumbergenerator"/>
    </uap:Extension>
</Extensions>
...

Ao lado do elemento AppService , adicione o atributo SupportsRemoteSystems :

...
<uap3:AppService Name="com.microsoft.randomnumbergenerator" SupportsRemoteSystems="true"/>
...

Para usar elementos neste namespace uap3 , você deve adicionar a definição de namespace na parte superior do arquivo de manifesto se ele ainda não estiver lá.

<?xml version="1.0" encoding="utf-8"?>
<Package
  xmlns="http://schemas.microsoft.com/appx/manifest/foundation/windows10"
  xmlns:mp="http://schemas.microsoft.com/appx/2014/phone/manifest"
  xmlns:uap="http://schemas.microsoft.com/appx/manifest/uap/windows10"
  xmlns:uap3="http://schemas.microsoft.com/appx/manifest/uap/windows10/3">
  ...
</Package>

Em seguida, crie seu projeto de provedor de serviços de aplicativo e implante-o nos dispositivos host.

Direcionar o serviço de app do dispositivo cliente

O dispositivo do qual o serviço de app remoto deve ser chamado precisa de um app com a funcionalidade Sistemas Remotos. Isso pode ser adicionado ao mesmo app que fornece o serviço de app no dispositivo host (nesse caso, você deve instalar o mesmo app nos dois dispositivos) ou implementado em um app completamente diferente.

As seguintes instruções using são necessárias para o código nesta seção ser executado no estado em que se encontra:

using Windows.ApplicationModel.AppService;
using Windows.System.RemoteSystems;

Primeiro você deve instanciar um objeto AppServiceConnection, como se estivesse chamando um serviço de aplicativo localmente. Esse processo é explicado com mais detalhes em Criar e consumir um serviço de app. Neste exemplo, o serviço de app de destino é o serviço de gerador de número aleatório.

Observação

Presume-se que um objeto RemoteSystem já tenha sido adquirido por outros meios no código que chama o método a seguir. Consulte Iniciar um aplicativo remoto para obter instruções sobre como configurá-lo.

// This method returns an open connection to a particular app service on a remote system.
// param "remotesys" is a RemoteSystem object representing the device to connect to.
private async void openRemoteConnectionAsync(RemoteSystem remotesys)
{
    // Set up a new app service connection. The app service name and package family name that
    // are used here correspond to the AppServices UWP sample.
    AppServiceConnection connection = new AppServiceConnection
    {
        AppServiceName = "com.microsoft.randomnumbergenerator",
        PackageFamilyName = "Microsoft.SDKSamples.AppServicesProvider.CS_8wekyb3d8bbwe"
    };

Em seguida, um objeto RemoteSystemConnectionRequest é criado para o dispositivo remoto pretendido. Ele é usado para abrir o AppServiceConnection para esse dispositivo. Observe que, no exemplo a seguir, o tratamento de erros e os relatórios estão bastante simplificados por questões de brevidade.

// a valid RemoteSystem object is needed before going any further
if (remotesys == null)
{
    return;
}

// Create a remote system connection request for the given remote device
RemoteSystemConnectionRequest connectionRequest = new RemoteSystemConnectionRequest(remotesys);

// "open" the AppServiceConnection using the remote request
AppServiceConnectionStatus status = await connection.OpenRemoteAsync(connectionRequest);

// only continue if the connection opened successfully
if (status != AppServiceConnectionStatus.Success)
{
    return;
}

Neste ponto, você deve ter uma conexão aberta com um serviço de app em uma máquina remota.

Trocar mensagens específicas de serviços pela conexão remota

A partir daqui, você pode enviar e receber mensagens de e para o serviço na forma de objetos ValueSet (para obter mais informações, consulte Criar e consumir um serviço de app). O serviço de gerador de número aleatório considera dois inteiros com as chaves "minvalue" e "maxvalue" como entradas, seleciona aleatoriamente um inteiro em seu intervalo e o devolve para o processo de chamada com a chave "Result".

    // create the command input
    ValueSet inputs = new ValueSet();

    // min_value and max_value vars are obtained somewhere else in the program
    inputs.Add("minvalue", min_value);
    inputs.Add("maxvalue", max_value);

    // send input and receive output in a variable
    AppServiceResponse response = await connection.SendMessageAsync(inputs);

    string result = "";
    // check that the service successfully received and processed the message
    if (response.Status == AppServiceResponseStatus.Success)
    {
        // Get the data that the service returned:
        result = response.Message["Result"] as string;
    }
}

Agora que você já está conectado a um serviço de app em um dispositivo host de destino, execute uma operação nesse dispositivo e receba os dados em seu dispositivo cliente em resposta.

Visão geral de aplicativos e dispositivos conectados (Project Rome)
Iniciar um aplicativo remoto
Criar e consumir um serviço de aplicativo
Referência de API de sistemas remotos
Exemplo de Sistemas Remotos