Starten einer App auf einem Remotegerät

In diesem Artikel wird das Starten einer Windows-App auf einem Remotegerät beschrieben.

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. Dies ist der einfachste Anwendungsfall von Project Rome.

Die Remotestartfunktion ermöglicht aufgabenorientierte Benutzerfreundlichkeit; Ein Benutzer kann eine Aufgabe auf einem Gerät starten und auf einem anderen beenden. Wenn der Benutzer beispielsweise musikhört auf dem Handy im Auto, könnte er die Wiedergabefunktionen an seine Xbox One übergeben, wenn er zu Hause ankommt. Mithilfe des Remotestarts können Apps kontextbezogene Daten an die gestartete Remote-App übergeben, um an der Stelle zu bleiben, an der die Aufgabe aufgehört wurde.

Vorläufige Einrichtung

Hinzufügen der Funktionen „remoteSystem“

Damit Ihre App eine App auf einem Remotegerät starten kann, müssen Sie Ihrem App-Paketmanifest die Funktion remoteSystem hinzufügen. Sie können den Paketmanifest-Designer verwenden, um es hinzuzufügen, indem Sie auf der Registerkarte FunktionenRemotesystem auswählen, oder Sie können die folgende Zeile manuell der Datei Package.appxmanifest Ihres Projekts hinzufügen.

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

Aktivieren der geräteübergreifenden Freigabe

Darüber hinaus muss das Clientgerät so festgelegt werden, dass es geräteübergreifende Freigaben zulässt. Diese Einstellung, auf die unter Einstellungen:Gemeinsame Systemerfahrungen>>geräteübergreifend zugegriffen wird, ist standardmäßig aktiviert.

Einstellungsseite für freigegebene Erfahrungen

Suchen eines Remotegeräts

Sie müssen zunächst das Gerät suchen, zu dem Sie eine Verbindung herstellen möchten. Eine detaillierte Anleitung dazu finden Sie unter Ermitteln von Remotegeräten. Wir verwenden hier eine einfache Methode, bei der die Funktionen zum Filtern nach Gerät oder nach Verbindungsart nicht verwendet werden. 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. Auf diese Weise erhalten wir eine Sammlung von Remotegeräten.

Der Code in diesen Beispielen erfordert, dass Sie eine using Windows.System.RemoteSystems Anweisung in Ihren Klassendateien haben.

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. Überprüfen Sie den Rückgabewert, um sicherzustellen, dass Ihre App auf Remotegeräte zugreifen darf. Diese Überprüfung ist beispielsweise nicht erfolgreich, wenn Sie Ihrer App nicht die Funktion remoteSystem hinzugefügt haben.

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. Wir verwenden diese Ereignishandler, um eine fortlaufend aktualisierte Liste der Geräte zu führen, mit denen wir eine Verbindung herstellen können.

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. Eine ObservableCollection wird verwendet, um die Liste der Geräte zu enthalten, die wir auflisten können. Eine ObservableCollection macht es auch einfach, die Liste der Geräte an die Benutzeroberfläche zu binden, obwohl wir dies in diesem Beispiel nicht tun werden.

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.

Starten einer App auf einem Remotegerät

Sie starten eine App remote, indem Sie das Gerät, mit dem Sie eine Verbindung herstellen möchten, an die RemoteLauncher.LaunchUriAsync-API übergeben. Für diese Methode gibt es drei Überladungen. Die einfachste Überladung, die in diesem Beispiel gezeigt wird, gibt den URI an, der die App auf dem Remotegerät aktiviert. In diesem Beispiel öffnet der URI die Karten-App auf dem Remotecomputer mit einer 3D-Ansicht der 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. Sie können auch Daten in Form von Schlüssel-Wert-Paaren bereitstellen. 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.

In Szenarien in der Praxis können Sie eine Benutzeroberfläche bereitstellen, um das Zielgerät auszuwählen. In diesem Beispiel verwenden wir zur Vereinfachung nur das erste Remotegerät in der Liste.

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.

API-Referenz für Remotesysteme
Übersicht über verbundene Apps und Geräte (Project Rome)
Entdecken von Remotegeräten
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.