Lancer une application sur un appareil distantLaunch an app on a remote device

Cet article explique comment lancer une application Windows sur un appareil distant.This article explains how to launch a Windows app on a remote device.

Depuis Windows 10 version 1607, une application UWP peut lancer une application UWP ou une application de bureau Windows à distance sur un autre appareil qui exécute également Windows 10 version 1607 ou ultérieure, pourvu que les deux appareils soient signés avec le même compte 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). C’est le cas d’utilisation le plus simple du projet Rome.This is the simplest use case of Project Rome.

La fonctionnalité de lancement à distance active les expériences utilisateur orientées tâche ; un utilisateur peut démarrer une tâche sur un appareil et le terminer sur un autre.The remote launch feature enables task-oriented user experiences; a user can start a task on one device and finish it on another. Par exemple, si l’utilisateur est à l’écoute de musique sur son téléphone dans sa voiture, il peut ensuite lire les fonctionnalités sur son Xbox lorsqu’il arrive chez lui.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. Le lancement à distance permet aux applications de transmettre des données contextuelles à l’application distante en cours de lancement, afin de reprendre l’emplacement où la tâche a été interrompue.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.

Installation préliminairePreliminary setup

Ajouter la fonctionnalité remoteSystemAdd the remoteSystem capability

Pour que votre application puisse lancer une application sur un appareil distant, vous devez ajouter la fonctionnalité remoteSystem dans le manifeste de votre package d’application.In order for your app to launch an app on a remote device, you must add the remoteSystem capability to your app package manifest. Vous pouvez utiliser le concepteur de manifeste de package pour l’ajouter en sélectionnant système distant sous l’onglet fonctionnalités , ou vous pouvez ajouter manuellement la ligne suivante au fichier Package. appxmanifest de votre projet.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>

Activer le partage entre appareilsEnable cross-device sharing

En outre, l’appareil client doit être configuré pour autoriser le partage entre appareils.Additionally, the client device must be set to allow cross-device sharing. Ce paramètre, qui est accessible dans paramètres: System > expériences partagées du système partagé > entre les appareils, est activé par défaut.This setting, which is accessed in Settings: System > Shared experiences > Share across devices, is enabled by default.

page des paramètres des expériences partagées

Trouver un appareil distantFind a remote device

Vous devez tout d’abord trouver l’appareil auquel vous souhaitez vous connecter.You must first find the device that you want to connect with. La section Détecter les périphériques distants explique en détail comment faire.Discover remote devices discusses how to do this in detail. Nous allons utiliser une approche simple, qui permet un filtrage par type d’appareil ou de connectivité.We'll use a simple approach here that forgoes filtering by device or connectivity type. Nous allons créer un observateur qui recherche des appareils distants et écrire des gestionnaires d’événement qui surviennent lorsque des appareils sont détectés ou supprimés.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. Ce qui nous fournira un ensemble d’appareils distants.This will provide us with a collection of remote devices.

Le code de ces exemples exige que vous disposiez using Windows.System.RemoteSystems d’une instruction dans vos fichiers 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();
    }
}

La première chose à faire avant d’effectuer lancement à distance est d’appeler RemoteSystem.RequestAccessAsync().The first thing you must do before making a remote launch is call RemoteSystem.RequestAccessAsync(). Vérifiez la valeur de retour pour vous assurer que votre application est autorisée à accéder à des appareils distants.Check the return value to make sure your app is allowed to access remote devices. Cette vérification peut échouer si vous n’avez ajouté la fonctionnalité remoteSystem à votre application.One reason this check could fail is if you haven't added the remoteSystem capability to your app.

Les gestionnaires d’événements de l’Observateur du système sont appelés lorsqu’un appareil auquel nous pouvons nous connecter est détecté ou n’est plus disponible.The system watcher event handlers are called when a device that we can connect with is discovered or is no longer available. Nous allons utiliser ces gestionnaires d’événements pour conserver une liste mise à jour d’appareils auxquels nous pouvons nous connecter.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);
}

Nous assurons le suivi des appareils par ID de système distant, à l’aide d’un dictionnaire.We will track the devices by remote system ID using a Dictionary. Un objet ObservableCollection est utilisé pour stocker la liste des appareils que nous pouvons énumérer.An ObservableCollection is used to hold the list of devices that we can enumerate. Un objet ObservableCollection facilite aussi la liaison de la liste des appareils à l’interface utilisateur, mais nous nous en dispenserons dans cet exemple.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>();

Ajoutez un appel à BuildDeviceList() dans le code de démarrage de l’application avant d’essayer de lancer une application à distance.Add a call to BuildDeviceList() in your app startup code before you attempt to launch a remote app.

Lancer une application sur un appareil distantLaunch an app on a remote device

Lancez une application à distance en passant l’appareil auquel vous souhaitez vous connecter à l’API RemoteLauncher. LaunchUriAsync .Launch an app remotely by passing the device you wish to connect with to the RemoteLauncher.LaunchUriAsync API. Il existe trois surcharges pour cette méthode.There are three overloads for this method. La plus simple, reprise dans cet exemple, spécifie l’URI qui active l’application sur l’appareil distant.The simplest, which this example demonstrates, specifies the URI that will activate the app on the remote device. Dans cet exemple, l’URI ouvre l’application Cartes sur l’ordinateur distant avec une vue 3D sur l’Aiguille de l’espace de Seattle.In this example the URI opens the Maps app on the remote machine with a 3D view of the Space Needle.

Les autres surcharges de RemoteLauncher.LaunchUriAsync vous permettent de spécifier des options telles que l’URI du site web à afficher si aucune application capable de gérer l’URI ne peut être lancée sur l’appareil distant, et une liste facultative de noms de famille de package pouvant servir à lancer l’URI sur l’appareil distant.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. Vous pouvez également fournir des données sous la forme de paires clé/valeur.You can also provide data in the form of key/value pairs. Vous pouvez transmettre des données à l’application que vous activez pour fournir un contexte à l’application distante, comme le nom de la chanson à lire et le lieu de lecture en cours lorsque vous basculez la lecture d’un appareil à un autre.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.

Concrètement, vous pouvez fournir l’interface utilisateur pour sélectionner l’appareil que vous souhaitez cibler.In practical scenarios, you might provide UI to select the device you want to target. Mais pour simplifier cet exemple, nous allons utiliser le premier appareil distant sur la liste.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"));
}

L’objet RemoteLaunchUriStatus renvoyé par RemoteLauncher.LaunchUriAsync() permet de savoir si le lancement à distance a abouti ou non (et dans ce cas, la raison de l’échec).The RemoteLaunchUriStatus object that is returned from RemoteLauncher.LaunchUriAsync() provides information about whether the remote launch succeeded, and if not, the reason why.

Référence sur l’API Systèmes distantsRemote Systems API reference
Vue d’ensemble des applications et appareils connectés (Rome du projet)Connected apps and devices (Project Rome) overview
Détecter des appareils distantsDiscover remote devices
L’exemple Systèmes distants montre comment détecter un système distant, lancer une application sur un système distant et utiliser des services d’application pour échanger des messages avec des applications qui s’exécutent sur deux systèmes.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.