Windows 앱 SDK 앱 서비스 만들기 및 사용

앱 서비스를 사용하면 앱이 다른 앱에 서비스를 제공할 수 있습니다. 앱 서비스는 별도의 프로세스에서 백그라운드 작업으로 실행되며 요청/응답 통신 채널을 노출합니다. 다른 앱은 AppServiceConnection을 사용하여 서비스에 연결합니다.

Important

앱 서비스에는 MSIX 패키지 ID가 필요합니다. 공급자 및 소비자 앱은 모두 패키지되어야 합니다. 패키지되지 않은 데스크톱 앱은 앱 서비스를 호스트하거나 연결할 수 없습니다.

메모

Windows 앱 SDK 앱은 out-of-process 백그라운드 작업으로만 앱 서비스를 호스트할 수 있습니다. Microsoft.UI.Xaml.Application에서는 재정의를 OnBackgroundActivated 제공하지 않으며 ExtendedActivationKind에는 앱 서비스 활성화 종류가 포함되지 않으므로 Windows 앱 SDK 앱은 UWP 앱이 할 수 있는 방식으로 자체 프로세스에서 직접 앱 서비스 활성화를 받을 수 없습니다. 자세한 내용은 In-Process 앱 서비스가 지원되지 않음 을 참조하세요.

앱 서비스의 작동 방식

앱 서비스는 다음으로 구성됩니다.

  1. 서비스를 선언하고 구현하는 공급자 앱입니다.
  2. 서비스에 연결하고 요청을 보내는 소비자 앱입니다.

통신은 요청 및 응답 데이터에 ValueSet 개체를 사용합니다.

앱 서비스 공급자 만들기

1단계: 매니페스트에서 앱 서비스 선언

appService 공급자 앱Package.appxmanifest에 확장을 추가하고 서비스를 구현하는 백그라운드 작업 프로젝트의 진입점을 지정합니다.

<Extensions>
  <uap:Extension Category="windows.appService">
    <uap:AppService Name="com.example.myappservice"
                    EntryPoint="MyAppService.ServiceTask" />
  </uap:Extension>
</Extensions>

2단계: 서비스 구현

별도의 Windows 런타임 구성 요소 프로젝트를 만들고 구현IBackgroundTask합니다. 백그라운드 작업은 out-of-process로 실행되므로 이 패턴은 공급자 앱이 Windows 앱 SDK 또는 UWP를 사용하여 빌드되었는지 여부에 관계없이 작동합니다.

// MyAppService.ServiceTask, in a separate Windows Runtime Component project
public sealed class ServiceTask : IBackgroundTask
{
    private BackgroundTaskDeferral _deferral;

    public void Run(IBackgroundTaskInstance taskInstance)
    {
        _deferral = taskInstance.GetDeferral();
        taskInstance.Canceled += OnTaskCanceled;

        var details = taskInstance.TriggerDetails as AppServiceTriggerDetails;
        if (details != null)
        {
            details.AppServiceConnection.RequestReceived += OnRequestReceived;
        }
    }

    private async void OnRequestReceived(AppServiceConnection sender,
        AppServiceRequestReceivedEventArgs args)
    {
        var deferral = args.GetDeferral();
        var response = new ValueSet();
        response.Add("result", "Hello from the service!");
        await args.Request.SendResponseAsync(response);
        deferral.Complete();
    }

    private void OnTaskCanceled(IBackgroundTaskInstance sender,
        BackgroundTaskCancellationReason reason)
    {
        _deferral?.Complete();
    }
}

앱 서비스 사용

소비자 앱에서 AppServiceConnection을 생성하고 요청을 보냅니다:

using Windows.ApplicationModel.AppService;
using Windows.Foundation.Collections;

private async Task CallAppServiceAsync()
{
    var connection = new AppServiceConnection
    {
        AppServiceName = "com.example.myappservice",
        PackageFamilyName = "ProviderApp_1234567890abc"
    };

    var status = await connection.OpenAsync();
    if (status != AppServiceConnectionStatus.Success)
    {
        // Handle connection failure
        return;
    }

    var request = new ValueSet
    {
        { "command", "add" },
        { "a", 5 },
        { "b", 3 }
    };

    var response = await connection.SendMessageAsync(request);
    if (response.Status == AppServiceResponseStatus.Success)
    {
        int result = (int)response.Message["result"];
        // result is 8
    }

    connection.Dispose();
}

팁 (조언)

PowerShell에서 Get-AppxPackage -Name *ProviderApp*을 실행하여 공급자 앱의 PackageFamilyName을 찾거나, 공급자 앱의 패키지 매니페스트를 확인합니다.

서비스가 별도 프로세스로 실행되어야 하는 이유

앱 서비스의 백그라운드 작업은 항상 자체 프로세스(또는 UWP 공급자에 대해서만 공급자 앱의 프로세스)에서 실행됩니다. Windows 앱 SDK 공급자 앱의 경우, 앱 자체 프로세스는 앱 서비스 활성화를 받을 수 있는 지원되는 방식이 없으므로 백그라운드 작업은 별도 프로세스에서 실행되어야 합니다. 자세한 내용은 In-process 앱 서비스가 지원되지 않음을 참조하세요.