원격 디바이스에서 앱 시작

이 문서에서는 원격 디바이스로 Windows 앱을 시작하는 방법을 설명합니다.

Windows 10 버전 1607부터 UWP 앱은 두 디바이스가 동일한 MSA(Microsoft 계정)로 로그온된 경우, Windows 10 버전 1607 이상까지 실행 중인 다른 디바이스에서 원격으로 UWP 앱 또는 Windows 데스크톱 애플리케이션을 시작할 수 있습니다. 다음은 프로젝트 로마의 가장 간단한 사용 사례입니다.

원격 실행 기능은 작업 지향 사용자 환경을 지원합니다. 사용자는 한 디바이스에서 작업을 시작한 후 다른 디바이스에서 완료할 수 있습니다. 예를 들어, 사용자가 자동차에서 휴대폰으로 음악을 듣고 있는 경우 집에 도착해서 재생 기능을 Xbox One으로 넘길 수 있습니다. 원격 실행을 사용하면 작업이 종료된 지점부터 시작하기 위해 앱이 실행 중인 원격 앱에 맥락 기반 데이터(contextual data)를 전달할 수 있습니다.

사전 설정

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

사전을 사용해서 원격 시스템 ID로 디바이스를 추적합니다. 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에 연결하려는 디바이스를 전달하여 앱을 원격으로 시작하세요. 이 메서드에 대한 오버로드는 세 가지가 있습니다. 이 예제에 나와 있는 가장 간단한 방법으로 원격 디바이스에서 앱을 활성화할 URI를 지정할 수 있습니다. 이 예제에서 해당 URI는 Space Needle(스페이스 니들)의 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 참조
연결된 앱 및 디바이스(프로젝트 로마) 개요
원격 디바이스 검색
원격 시스템 샘플은 원격 시스템을 검색하고, 원격 시스템에서 앱을 시작하고, 앱 서비스를 사용하여 두 시스템에서 실행되는 앱끼리 메시지를 보내는 방법을 보여 줍니다.