원격 디바이스에서 앱 시작Launch an app on a remote device

이 문서에서는 원격 장치에서 Windows 앱을 시작 하는 방법을 설명 합니다.This article explains how to launch a Windows app on a remote device.

Windows 10 버전 1607부터 UWP 앱은 동일한 Microsoft 계정 (MSA)을 사용 하 여 두 장치를 모두 사용 하는 경우 Windows 10, 버전 1607 이상을 실행 하는 다른 장치에서 UWP 앱 또는 Windows 데스크톱 응용 프로그램을 원격으로 시작할 수 있습니다.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). 이는 Project 로마의 가장 간단한 사용 사례입니다.This is the simplest use case of Project Rome.

원격 시작 기능을 사용 하면 작업 지향적인 사용자 환경을 사용할 수 있습니다. 사용자는 한 장치에서 작업을 시작 하 고 다른 장치에서 작업을 완료할 수 있습니다.The remote launch feature enables task-oriented user experiences; a user can start a task on one device and finish it on another. 예를 들어 사용자가 자동차의 휴대폰에서 음악을 수신 하는 경우 집에 도착할 때 Xbox One에 재생 기능을 직접 제공할 수 있습니다.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 launch allows apps to pass contextual data to the remote app being launched, in order to pick up where the task was left off.

예비 설정Preliminary setup

RemoteSystem 기능 추가Add the remoteSystem capability

앱이 원격 장치에서 앱을 시작 하도록 하려면 remoteSystem 앱 패키지 매니페스트에 기능을 추가 해야 합니다.In order for your app to launch an app on a remote device, you must add the remoteSystem capability to your app package manifest. 패키지 매니페스트 디자이너를 사용 하 여 기능 탭에서 원격 시스템 을 선택 하 여 추가 하거나 프로젝트의 appxmanifest.xml 파일에 다음 줄을 수동으로 추가할 수 있습니다.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>

장치 간 공유 사용Enable cross-device sharing

또한 클라이언트 장치에서 장치 간 공유를 허용 하도록 설정 해야 합니다.Additionally, the client device must be set to allow cross-device sharing. 설정에서 액세스 하는이 설정: 장치에서 시스템 > 공유 환경 > 공유는 기본적으로 사용 하도록 설정 되어 있습니다.This setting, which is accessed in Settings: System > Shared experiences > Share across devices, is enabled by default.

공유 환경 설정 페이지

원격 장치 찾기Find a remote device

먼저 연결 하려는 장치를 찾아야 합니다.You must first find the device that you want to connect with. 원격 장치 검색 이 작업을 수행 하는 방법에 대해 자세히 설명 합니다.Discover remote devices discusses how to do this in detail. 여기서는 장치 또는 연결 유형별로 필터링 하는 간단한 방법을 사용 합니다.We'll use a simple approach here that forgoes filtering by device or connectivity type. 원격 장치를 검색 하는 원격 시스템 감시자를 만들고 장치가 검색 되거나 제거 될 때 발생 하는 이벤트에 대 한 처리기를 작성 합니다.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. 그러면 원격 장치 컬렉션을 제공 합니다.This will provide us with a collection of remote devices.

이 예제의 코드를 사용 하려면 using Windows.System.RemoteSystems 클래스 파일에 문이 있어야 합니다.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();
    }
}

원격 시작을 수행 하기 전에 수행 해야 하는 첫 번째 작업은 호출 RemoteSystem.RequestAccessAsync() 입니다.The first thing you must do before making a remote launch is call RemoteSystem.RequestAccessAsync(). 반환 값을 확인 하 여 앱이 원격 장치에 액세스할 수 있는지 확인 합니다.Check the return value to make sure your app is allowed to access remote devices. 앱에 기능을 추가 하지 않은 경우이 검사가 실패할 수 있습니다 remoteSystem .One reason this check could fail is if you haven't added the remoteSystem capability to your app.

시스템 감시자 이벤트 처리기는 연결할 수 있는 장치를 검색 하거나 더 이상 사용할 수 없을 때 호출 됩니다.The system watcher event handlers are called when a device that we can connect with is discovered or is no longer available. 이러한 이벤트 처리기를 사용 하 여 연결할 수 있는 장치의 업데이트 된 목록을 유지 합니다.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);
}

사전을사용 하 여 원격 시스템 ID로 장치를 추적 합니다.We will track the devices by remote system ID using a Dictionary. System.collections.objectmodel.observablecollection 는 열거할 수 있는 장치 목록을 저장 하는 데 사용 됩니다.An ObservableCollection is used to hold the list of devices that we can enumerate. 또한 system.collections.objectmodel.observablecollection 를 사용 하면 장치 목록을 UI에 쉽게 바인딩할 수 있지만이 예제에서는이 작업을 수행 하지 않습니다.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>();

BuildDeviceList()원격 앱을 시작 하기 전에 앱 시작 코드에에 대 한 호출을 추가 합니다.Add a call to BuildDeviceList() in your app startup code before you attempt to launch a remote app.

원격 디바이스에서 앱 시작Launch an app on a remote device

연결 하려는 장치를 RemoteLauncher LaunchUriAsync API에 전달 하 여 원격으로 앱을 시작 합니다.Launch an app remotely by passing the device you wish to connect with to the RemoteLauncher.LaunchUriAsync API. 이 메서드에는 세 가지 오버 로드가 있습니다.There are three overloads for this method. 이 예제에서 설명 하는 가장 간단한 방법은 원격 장치에서 앱을 활성화할 URI를 지정 하는 것입니다.The simplest, which this example demonstrates, specifies the URI that will activate the app on the remote device. 이 예제에서 URI는 공간 니 들의 3D 뷰를 사용 하 여 원격 컴퓨터에서 맵 앱을 엽니다.In this example the URI opens the Maps app on the remote machine with a 3D view of the Space Needle.

다른 RemoteLauncher LaunchUriAsync 오버 로드를 사용 하 여 원격 장치에서 적절 한 앱을 시작할 수 없는 경우 표시할 웹 사이트의 uri와 같은 옵션을 지정 하 고, 원격 장치에서 uri를 시작 하는 데 사용할 수 있는 패키지 패밀리 이름의 선택적 목록을 지정할 수 있습니다.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. 데이터를 키/값 쌍의 형식으로 제공할 수도 있습니다.You can also provide data in the form of key/value pairs. 활성화 하는 앱에 데이터를 전달 하 여 재생할 노래 이름과 현재 재생 위치 (예: 한 장치에서 다른 장치로 재생을 전달할 때)와 같은 원격 앱에 컨텍스트를 제공할 수 있습니다.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.

실용적인 시나리오에서는 대상으로 지정할 장치를 선택 하는 UI를 제공할 수 있습니다.In practical scenarios, you might provide UI to select the device you want to target. 그러나이 예제를 간소화 하기 위해 목록의 첫 번째 원격 장치만 사용 합니다.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"));
}

LaunchUriAsync () 에서 반환 된 RemoteLaunchUriStatus 개체는 원격 시작에 성공 했는지 여부에 대 한 정보를 제공 하 고, 그렇지 않은 경우 이유를 제공 합니다.The RemoteLaunchUriStatus object that is returned from RemoteLauncher.LaunchUriAsync() provides information about whether the remote launch succeeded, and if not, the reason why.

원격 시스템 API 참조Remote Systems API reference
연결 된 앱 및 장치 (Project 로마) 개요Connected apps and devices (Project Rome) overview
원격 디바이스 검색Discover remote devices
원격 시스템 샘플 은 원격 시스템을 검색 하 고, 원격 시스템에서 앱을 시작 하 고, 앱 서비스를 사용 하 여 두 시스템에서 실행 되는 앱 간에 메시지를 보내는 방법을 보여 줍니다.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.