Starten einer App auf einem RemotegerätLaunch an app on a remote device

In diesem Artikel wird das Starten einer Windows-App auf einem Remotegerät beschrieben.This article explains how to launch a Windows app on a remote device.

Ab Windows 10, Version 1607, kann eine UWP-App eine UWP-App oder Windows-Desktopanwendung remote auf einem anderen Geräte starten, auf dem ebenfalls Windows 10, Version 1607 oder höher, ausgeführt wird. Voraussetzung ist, dass beide Geräte mit dem gleichen Microsoft-Konto (MSA) angemeldet sind.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). Dies ist der einfachste Anwendungsfall von Project Rom.This is the simplest use case of Project Rome.

Das Remote Start Feature ermöglicht aufgabenorientierte Benutzeroberflächen. ein Benutzer kann eine Aufgabe auf einem Gerät starten und auf einem anderen Gerät Fertigstellen.The remote launch feature enables task-oriented user experiences; a user can start a task on one device and finish it on another. Wenn der Benutzer z. b. Musik an seinem Telefon in seinem Auto abhört, könnte er die Wiedergabe Funktionalität an die Xbox 1 Hand geben, wenn er zu Hause kommt.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. Remote Start ermöglicht apps das Übergeben von Kontext Daten an die Remote-app, die gestartet wird, um den Speicherort der Aufgabe aufzurufen.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.

Vorläufige EinrichtungPreliminary setup

Hinzufügen der Funktionen „remoteSystem“Add the remoteSystem capability

Damit Ihre App eine App auf einem Remotegerät starten kann, müssen Sie Ihrem App-Paketmanifest die Funktion remoteSystem hinzufügen.In order for your app to launch an app on a remote device, you must add the remoteSystem capability to your app package manifest. Sie können den Paket Manifest-Designer verwenden, um ihn hinzuzufügen, indem Sie auf der Registerkarte " Funktionen " Remote System auswählen, oder Sie können die folgende Zeile manuell der Datei " Package. appxmanifest " des Projekts hinzufügen.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>

Aktivieren der Geräte übergreifenden FreigabeEnable cross-device sharing

Außerdem muss das Client Gerät so festgelegt werden, dass es die Geräte übergreifende Freigabe zulässt.Additionally, the client device must be set to allow cross-device sharing. Diese Einstellung ist standardmäßig aktiviert und wird in den Einstellungen: System > Shared Erlebnisse > auf Gerätengemeinsam genutzt.This setting, which is accessed in Settings: System > Shared experiences > Share across devices, is enabled by default.

Seite mit Einstellungen für freigegebene Erfahrungen

Suchen eines RemotegerätsFind a remote device

Sie müssen zunächst das Gerät suchen, zu dem Sie eine Verbindung herstellen möchten.You must first find the device that you want to connect with. Eine detaillierte Anleitung dazu finden Sie unter Ermitteln von Remotegeräten.Discover remote devices discusses how to do this in detail. Wir verwenden hier eine einfache Methode, bei der die Funktionen zum Filtern nach Gerät oder nach Verbindungsart nicht verwendet werden.We'll use a simple approach here that forgoes filtering by device or connectivity type. Wir erstellen ein Überwachungselement, das nach Remotesystemen sucht, und erstellen Handler für die Ereignisse, die ausgelöst werden, wenn Geräte erkannt oder entfernt werden.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. Auf diese Weise erhalten wir eine Sammlung von Remotegeräten.This will provide us with a collection of remote devices.

Der Code in diesen Beispielen erfordert, dass Sie über eine- using Windows.System.RemoteSystems Anweisung in der Klassendatei (en) verfügen.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();
    }
}

Als Erstes müssen Sie vor einem Remotestart die Funktion RemoteSystem.RequestAccessAsync() aufrufen.The first thing you must do before making a remote launch is call RemoteSystem.RequestAccessAsync(). Überprüfen Sie den Rückgabewert, um sicherzustellen, dass Ihre App auf Remotegeräte zugreifen darf.Check the return value to make sure your app is allowed to access remote devices. Diese Überprüfung ist beispielsweise nicht erfolgreich, wenn Sie Ihrer App nicht die Funktion remoteSystem hinzugefügt haben.One reason this check could fail is if you haven't added the remoteSystem capability to your app.

Die Ereignishandler der Systemüberwachung werden aufgerufen, wenn ein Gerät, mit dem wir eine Verbindung herstellen können, erkannt wird oder nicht mehr verfügbar ist.The system watcher event handlers are called when a device that we can connect with is discovered or is no longer available. Wir verwenden diese Ereignishandler, um eine fortlaufend aktualisierte Liste der Geräte zu führen, mit denen wir eine Verbindung herstellen können.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);
}

Wir verfolgen die Geräte nach Remotesystem-ID unter Verwendung eines Wörterbuchs nach.We will track the devices by remote system ID using a Dictionary. Eine ObservableCollection dient zum Speichern der Liste der Geräte, die aufgelistet werden können.An ObservableCollection is used to hold the list of devices that we can enumerate. Mit ObservableCollection ist es auch einfach, die Liste der Geräte an die Benutzeroberfläche zu binden, obwohl dies in diesem Beispiel nicht der Fall ist.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>();

Fügen Sie Ihrem App-Startcode einen Aufruf an BuildDeviceList() hinzu, bevor Sie versuchen, eine Remote-App zu starten.Add a call to BuildDeviceList() in your app startup code before you attempt to launch a remote app.

Starten einer App auf einem RemotegerätLaunch an app on a remote device

Sie starten eine App remote, indem Sie das Gerät, mit dem Sie eine Verbindung herstellen möchten, an die RemoteLauncher.LaunchUriAsync-API übergeben.Launch an app remotely by passing the device you wish to connect with to the RemoteLauncher.LaunchUriAsync API. Für diese Methode gibt es drei Überladungen.There are three overloads for this method. Die einfachste Überladung, die in diesem Beispiel gezeigt wird, gibt den URI an, der die App auf dem Remotegerät aktiviert.The simplest, which this example demonstrates, specifies the URI that will activate the app on the remote device. In diesem Beispiel öffnet der URI die Karten-App auf dem Remotecomputer mit einer 3D-Ansicht der Space Needle.In this example the URI opens the Maps app on the remote machine with a 3D view of the Space Needle.

Andere RemoteLauncher.LaunchUriAsync-Überladungen ermöglichen die Angabe von Optionen, wie den URI der Website, die angezeigt werden soll, wenn keine entsprechende App auf dem Remotegerät gestartet werden kann, und die Angabe einer optionalen Liste der Paketfamiliennamen, die zum Starten des URIs auf dem Remotegerät verwendet werden können.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. Sie können auch Daten in Form von Schlüssel-Wert-Paaren bereitstellen.You can also provide data in the form of key/value pairs. Sie können beispielsweise Daten an die App übergeben, die Sie aktivieren, um einen Kontext für die Remote-App bereitzustellen, etwa den Namen des wiederzugebenden Titels oder die aktuelle Position der Wiedergabe bei der Übergabe von einem Gerät an ein anderes.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.

In Szenarien in der Praxis können Sie eine Benutzeroberfläche bereitstellen, um das Zielgerät auszuwählen.In practical scenarios, you might provide UI to select the device you want to target. In diesem Beispiel verwenden wir zur Vereinfachung nur das erste Remotegerät in der 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"));
}

Das RemoteLaunchUriStatus-Objekt, das von RemoteLauncher.LaunchUriAsync() zurückgegeben wird, enthält Informationen dazu, ob der Remotestart erfolgreich war. Wenn bei dem Remotestart ein Fehler aufgetreten ist, wird ein Grund angegeben.The RemoteLaunchUriStatus object that is returned from RemoteLauncher.LaunchUriAsync() provides information about whether the remote launch succeeded, and if not, the reason why.

API-Referenz für RemotesystemeRemote Systems API reference
Übersicht über verbundene apps und Geräte (Project Rom)Connected apps and devices (Project Rome) overview
Entdecken von RemotegerätenDiscover remote devices
Das Beispiel für Remotesysteme zeigt die Vorgehensweise zum Erkennen eines Remotesystems, Starten einer App auf einem Remotesystem und Verwenden von App-Diensten zum Senden von Nachrichten zwischen Apps, die auf zwei Systemen ausgeführt werden.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.