다음을 통해 공유


웹 위젯 공급자

최신 릴리스에서 Windows 위젯을 구현하는 앱은 원격 URL에서 제공되는 HTML로 위젯 콘텐츠를 채우도록 선택할 수 있습니다. 이전에는 위젯 콘텐츠를 공급자에서 위젯 보드로 전달된 JSON 페이로드의 적응형 카드 스키마 형식으로만 제공할 수 있습니다. 웹 위젯 공급자는 여전히 적응형 카드 JSON 페이로드를 제공해야 하므로 C# Windows 앱에서 위젯 공급자 구현 또는 win32 앱에서 위젯 공급자 구현(C++/WinRT)에서 위젯 공급자를 구현하는 단계를 따라야 합니다.

콘텐츠 URL 지정

위젯 공급자는 WidgetManager.UpdateWidget을 호출하여 위젯 보드에 JSON 페이로드를 전달합니다. 웹 위젯의 경우 위젯 콘텐츠를 정의하는 본문 개체를 제공하는 대신 빈 본문 개체를 지정하고 대신 위젯에 HTML 콘텐츠를 제공할 URL을 가리키는 webUrl 필드가 있는 메타데이터 개체를 포함해야 합니다.

{ 
    "type": "AdaptiveCard", 
    "$schema": "http://adaptivecards.io/schemas/adaptive-card.json", 
    "version": "1.6", 
    "body": [], 
    "metadata": 
    { 
        "webUrl": "https://www.contoso.com/widgetprovider.html" 
    } 
} 

리소스 요청 처리

위젯 공급자는 공급자의 패키지 매니페스트 파일에 있는 Definition 요소의 WebRequestFilter 특성에서 위젯에 대한 웹 요청 필터 문자열을 지정할 수 있습니다. 위젯 콘텐츠가 필터와 일치하는 URI로 리소스를 요청할 때마다 요청이 가로채지고 위젯 공급자의 IWidgetResourceProvider.OnResourceRequested 구현으로 리디렉션됩니다.

필터 패턴은 일치 패턴에 설명된 형식을 사용하여 표현 됩니다. 등록의 필터 문자열은 필요한 경우 Punycode를 사용해야 합니다. 일치할 경우 모든 콘텐츠 형식이 리디렉션되므로 필터는 애플리케이션에서 IWidgetResourceProvider를 통해 가져오려는 콘텐츠로만 해결되어야 합니다. 위젯 공급자 패키지 매니페스트 형식에 대한 자세한 내용은 위젯 공급자 패키지 매니페스트 XML 형식을 참조하세요.

리소스 요청을 처리하려면 위젯 공급자가 IWidgetResourceProvider 인터페이스를 구현해야 합니다.

internal class WidgetProvider : IWidgetProvider, IWidgetResourceProvider

OnResourceRequested 메서드의 구현에서 위젯 공급자는 위젯ResourceRequestedArgs.Response 속성을 요청된 리소스가 포함된 WidgetResourceResponse 개체로 설정하여 요청된 리소스를 제공할 수 있습니다. 리소스를 비동기적으로 가져올 때 공급자는 WidgetResourceRequestedArgs.GetDeferral 을 호출하여 지연을 요청한 다음 리소스가 설정되면 지연을 완료해야 합니다.

async void IWidgetResourceProvider.OnResourceRequested(WidgetResourceRequestedArgs args)
{
    var deferral = args.GetDeferral();

    if (args.Request.Uri.Length > 0)
    {
        if (args.Request.Uri == "https://contoso.com/logo-image")
        {
            string fullPath = Windows.ApplicationModel.Package.Current.InstalledPath + "/Assets/image.png";
            var file = await StorageFile.GetFileFromPathAsync(fullPath);
            var response = new WidgetResourceResponse(RandomAccessStreamReference.CreateFromFile(file), "OK", 200);
            response.Headers.Add("Content-Type", "image/png");
            args.Response = response;
        }
    }

    deferral.Complete();
}

공급자가 메서드에 전달 된 WidgetResourceRequestedArgs 개체에 대한 응답을 설정하지 않으면 시스템에서 웹에서 리소스를 검색합니다. 이 경우 공급자는 사용자 컨텍스트 또는 토큰을 제공하는 등 WidgetResourceRequestedArgs.Request 개체의 Headers 속성을 수정하도록 선택할 수 있으며, 시스템은 웹에서 리소스를 검색할 때 업데이트된 헤더를 사용합니다.

웹 콘텐츠로의 및 웹 콘텐츠로부터의 메시지 처리

window.chrome.webview.postMessage JavaScript 메서드를 사용하여 게시된 위젯 콘텐츠에서 문자열 메시지를 수신하려면 위젯 공급자가 IWidgetProviderMessage 인터페이스를 구현하고 OnMessageReceived 메서드를 구현할 수 있습니다.

internal class WidgetProvider : IWidgetProvider, IWidgetProviderMessage
...
public void OnMessageReceived(WidgetMessageReceivedArgs args)
{
    Console.WriteLine($"Message received from widget {args.WidgetContext.Id}: {args.Message}");
}

위젯 공급자는 WidgetManager.SendMessage를 호출하여 위젯의 웹 콘텐츠에 메시지를 보낼 수 있습니다. 메시지가 전송되는 위젯의 ID를 제공해야 합니다. 이 값은 공급자의 패키지 매니페스트 파일에 있는 Definition 요소의 ID 특성에 지정된 값입니다. 자세한 내용은 위젯 공급자 패키지 매니페스트 XML 형식을 참조하세요. 메시지 문자열은 단순 텍스트이거나 웹 콘텐츠에서 해석되는 개체의 직렬화된 형식일 수 있습니다. 자세한 내용은 PostWebMessageAsString을 참조하세요.

var message = $"{{ \"current_location\": \"{ location }\" }}";
WidgetManager.GetDefault().SendMessageToContent("Weather_Widget", message);

제한 사항 및 요구 사항

  • 이 기능은 EEA(유럽 경제 지역)의 사용자만 사용할 수 있습니다. EEA에서 피드 공급자를 구현하는 설치된 앱은 위젯 보드에서 콘텐츠 피드를 제공할 수 있습니다.