원격 앱 서비스와 통신
URI를 사용하여 원격 디바이스로 앱을 시작하는 것 외에 원격 디바이스로 앱 서비스를 실행하고 해당 서비스와 통신할 수도 있습니다. 모든 Windows 기반 디바이스는 클라이언트 디바이스 또는 호스트 디바이스로 사용할 수 있습니다. 이렇게 하면 앱을 포그라운드로 가져올 필요 없이, 연결된 디바이스와 거의 무제한적인 가짓수의 방법으로 상호 작용할 수 있게 됩니다.
호스트 디바이스의 앱 서비스 설정
원격 디바이스로 앱 서비스를 실행하려면 해당 디바이스에 해당 앱 서비스의 공급자가 이미 설치된 상태여야 합니다. 이 가이드에서는 CSharp 버전의 난수 생성기 앱 서비스 샘플을 사용합니다. 이 샘플은 Windows 유니버설 샘플 리포지토리에 있습니다. 사용자 고유의 앱 서비스를 작성하는 방법에 대한 지침은 앱 서비스 생성 및 사용을 참조하세요.
이미 만든 앱 서비스를 사용하든, 아니면 직접 작성하든 간에, 해당 서비스를 원격 시스템과 호환되도록 하기 위해서는 몇 가지 편집을 수행해야 합니다. Visual Studio에서 앱 서비스 공급자 프로젝트(샘플의 "AppServicesProvider")로 이동한 다음 해당 Package.appxmanifest 파일을 선택합니다. 파일의 전체 내용을 보려면 마우스 오른쪽 버튼을 클릭하고 코드 보기를 선택하세요. 기본 Application 요소 내부에 Extensions 요소를 만듭니다(또는 이미 있는 경우 찾기). 그런 다음 확장을 만들어 프로젝트를 App Service로 정의하고 상위 프로젝트를 참조하세요.
...
<Extensions>
<uap:Extension Category="windows.appService" EntryPoint="RandomNumberService.RandomNumberGeneratorTask">
<uap3:AppService Name="com.microsoft.randomnumbergenerator"/>
</uap:Extension>
</Extensions>
...
AppService 요소 옆에 SupportsRemoteSystems 특성을 추가합니다.
...
<uap3:AppService Name="com.microsoft.randomnumbergenerator" SupportsRemoteSystems="true"/>
...
이 uap3 네임스페이스의 요소를 사용하려면 아직 없는 경우 매니페스트 파일 상단에 네임스페이스 정의를 추가해야 합니다.
<?xml version="1.0" encoding="utf-8"?>
<Package
xmlns="http://schemas.microsoft.com/appx/manifest/foundation/windows10"
xmlns:mp="http://schemas.microsoft.com/appx/2014/phone/manifest"
xmlns:uap="http://schemas.microsoft.com/appx/manifest/uap/windows10"
xmlns:uap3="http://schemas.microsoft.com/appx/manifest/uap/windows10/3">
...
</Package>
그런 다음 앱 서비스 공급자 프로젝트를 작성하고 호스트 디바이스에 배포합니다.
클라이언트 디바이스에서 앱 서비스 대상 지정
원격 앱 서비스를 호출할 디바이스에는 원격 시스템 기능이 있는 앱이 필요합니다. 이 기능은 호스트 디바이스로 앱 서비스를 제공하는 동일한 앱에 추가하거나(이 경우 두 디바이스에 동일한 앱을 설치할 수 있음) 완전히 다른 앱에서 구현할 수 있습니다.
이 섹션의 코드가 있는 그대로 실행되려면 다음 using 구문이 필요합니다.
using Windows.ApplicationModel.AppService;
using Windows.System.RemoteSystems;
먼저 앱 서비스를 로컬로 호출하듯이 AppServiceConnection 개체를 인스턴스화해야 합니다. 이 프로세스는 앱 서비스 생성 및 사용에 자세히 설명되어 있습니다. 이 예제에서 대상으로 지정할 앱 서비스는 난수 생성기 서비스입니다.
참고 항목
다음 메서드를 호출하는 코드 내에서 어떤 방법으로 RemoteSystem 개체를 이미 획득했다고 가정해 봅시다. 이 기능을 설정하는 방법에 대한 지침은 원격 앱 시작을 참조하세요.
// This method returns an open connection to a particular app service on a remote system.
// param "remotesys" is a RemoteSystem object representing the device to connect to.
private async void openRemoteConnectionAsync(RemoteSystem remotesys)
{
// Set up a new app service connection. The app service name and package family name that
// are used here correspond to the AppServices UWP sample.
AppServiceConnection connection = new AppServiceConnection
{
AppServiceName = "com.microsoft.randomnumbergenerator",
PackageFamilyName = "Microsoft.SDKSamples.AppServicesProvider.CS_8wekyb3d8bbwe"
};
그런 다음, 의도한 원격 디바이스에 대해 RemoteSystemConnectionRequest 개체를 생성합니다. 이 개체는 이후 해당 디바이스에 대한 AppServiceConnection을 여는 데 사용됩니다. 아래 예제에서는 간결성을 높이기 위해 오류 처리 및 보고가 크게 간소화되었습니다.
// a valid RemoteSystem object is needed before going any further
if (remotesys == null)
{
return;
}
// Create a remote system connection request for the given remote device
RemoteSystemConnectionRequest connectionRequest = new RemoteSystemConnectionRequest(remotesys);
// "open" the AppServiceConnection using the remote request
AppServiceConnectionStatus status = await connection.OpenRemoteAsync(connectionRequest);
// only continue if the connection opened successfully
if (status != AppServiceConnectionStatus.Success)
{
return;
}
이 시점에서는 원격 머신의 앱 서비스에 대한 연결이 열려 있어야 합니다.
원격 연결을 통한 서비스별 메시지 교환
여기서는 ValueSet 개체의 형태로 서비스와의 메시지를 전송하거나 수신할 수 있습니다(자세한 내용은 앱 서비스 생성 및 사용 참조). 난수 생성기 서비스는 "minvalue"
키 및 "maxvalue"
키가 있는 두 개의 정수를 입력으로 사용하고, 이 두 정수의 범위 내에서 한 정수를 임의로 선택하고, "Result"
키를 사용하여 해당 정수를 호출 프로세스로 반환합니다.
// create the command input
ValueSet inputs = new ValueSet();
// min_value and max_value vars are obtained somewhere else in the program
inputs.Add("minvalue", min_value);
inputs.Add("maxvalue", max_value);
// send input and receive output in a variable
AppServiceResponse response = await connection.SendMessageAsync(inputs);
string result = "";
// check that the service successfully received and processed the message
if (response.Status == AppServiceResponseStatus.Success)
{
// Get the data that the service returned:
result = response.Message["Result"] as string;
}
}
이제 대상 호스트 디바이스의 앱 서비스에 연결되었고, 해당 디바이스에서 작업이 실행되며, 응답에 따라 클라이언트 디바이스로 데이터를 수신했습니다.
관련 항목
연결된 앱 및 디바이스(프로젝트 로마) 개요
원격 앱 실행
앱 서비스 만들기 및 사용하기
원격 시스템 API 참조
원격 시스템 샘플