啟動遠端裝置上的應用程式

本文說明如何在遠端裝置上啟動 Windows 應用程式。

從 Windows 10 版本 1607 開始,UWP 應用程式可以在同樣執行 Windows 10 版本 1607 或更高版本的另一台裝置上遠端啟動 UWP 應用程式或Windows 桌面應用程式,前提是這兩個裝置使用相同的Microsoft 帳戶 (MSA) 登入。 這是 Project Rome 最簡單的使用案例。

遠端啟動功能可實現面向工作的使用者體驗;使用者可以在一台裝置上開始工作並在另一台裝置上完成工作。 例如,如果使用者在車上用手機聽音樂,那麼當他們回到家時,他們可以將播放功能移交給 Xbox One。 遠端啟動允許應用程式將內文資料傳遞到正在啟動的遠端應用程式,以便從中斷的位置繼續執行工作。

預備設定

新增 remoteSystem 功能

為了讓您的應用程式在遠端裝置上啟動應用程式,您必須將 remoteSystem 功能新增至應用程式套件資訊清單。 您可以使用套件資訊清單設計工具,在 [功能] 索引標籤上選取 [遠端系統],或手動將下列這一行新增至專案的 Package.appxmanifest 檔案。

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

啟用跨裝置共用

此外,用戶端裝置必須設定為允許跨裝置共用。 預設啟用此設置,可在設定系統>共享體驗跨裝置>共用中存取

shared experiences settings page

尋找遠端裝置

您必須先找到您想要連線的裝置。 探索遠端裝置會討論如何詳細執行這項操作。 我們將在這裡使用簡單的方法,以放棄依裝置或連線類型進行篩選。 我們將建立遠端系統監看員來尋找遠端裝置,並寫入探索或移除裝置時所引發事件的處理程式。 這會提供我們遠端裝置的集合。

這些範例中的程式碼要求您的類別檔案中有 using Windows.System.RemoteSystems 陳述式。

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();
    }
}

進行遠端啟動之前,您必須先執行的第一件事是呼叫 RemoteSystem.RequestAccessAsync()。 請檢查傳回值,以確定您的應用程式允許存取遠端裝置。 這項檢查可能會失敗的其中一個原因是您尚未將功能新增 remoteSystem 至您的應用程式。

系統監看員事件處理程式會在探索到可連線的裝置或已無法使用時呼叫。 我們將使用這些事件處理程式來保留可連線的裝置更新清單。

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);
}

我們將使用字典,依遠端系統標識碼來追蹤裝置。 ObservableCollection 可用來保存我們可以列舉的裝置清單。 ObservableCollection 也可以輕鬆地將裝置清單綁定到 UI,但在本例中我們不會這樣做。

private RemoteSystemWatcher m_remoteSystemWatcher;
private ObservableCollection<RemoteSystem> m_deviceList = new ObservableCollection<RemoteSystem>();
private Dictionary<string, RemoteSystem> m_deviceMap = new Dictionary<string, RemoteSystem>();

在嘗試啟動遠端應用程式之前,在應用程式啟動程式碼中新增對 BuildDeviceList() 的呼叫。

啟動遠端裝置上的應用程式

將您想要連線的裝置傳遞至 RemoteLauncher.LaunchUriAsync API,以從遠端啟動應用程式。 此方法有 3 個重載。 此範例示範的最簡單,會指定將在遠端裝置上啟動應用程式的 URI。 在此範例中,URI 會開啟遠端電腦上的地圖應用程式,並具有空間針頭的 3D 檢視。

其他 RemoteLauncher.LaunchUriAsync 多載可讓您指定選項,例如網站 URI,以便在遠端裝置上無法啟動適當的應用程式時檢視,以及可用來在遠端裝置上啟動 URI 的選擇性套件系列名稱清單。 您也可以以金鑰/值對的形式提供資料。 您可以將資料傳遞到正在啟動的應用程式,以便為遠端應用程式提供上下文,例如要播放的歌曲的名稱以及將播放從一台裝置切換到另一台裝置時的當前播放位置。

在實際案例中,您可能會提供 UI 來選取您想要設定目標的裝置。 但為了簡化此範例,我們只會使用清單中的第一個遠端裝置。

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"));
}

RemoteLauncher.LaunchUriAsync() 傳回的 RemoteLaunchUriStatus 物件提供有關遠端啟動是否成功的信息,如果未成功,則提供原因。

遠端系統 API 參考
已連線的應用程式與裝置 (Project Rome) 概覽
探索遠端裝置
請參閱遠端系統 UWP 範例介紹了了解如何發現遠端系統、在遠端系統上啟動應用程式以及使用應用程式服務在兩個系統上執行的應用程式之間發送訊息的範例。