Freigeben über


Web-Widget-Anbieter

In der neuesten Version können Apps, die Windows-Widgets implementieren, den Widgetinhalt mit HTML füllen, der von einer Remote-URL bereitgestellt wird. Bisher konnte der Widget-Inhalt nur im Adaptive Card-Schema-Format in der JSON-Nutzlast bereitgestellt werden, die vom Anbieter an das Widgets Board übergeben wurde. Da Web-Widget-Anbieter weiterhin eine JSON-Nutzlast im Adaptive Card-Format bereitstellen müssen, sollten Sie die Schritte zur Implementierung eines Widget-Anbieters in Implementieren eines Widget-Anbieters in einer C#-Windows-App oder Implementieren eines Widget-Anbieters in einer Win32-App (C++/WinRT) befolgen.

Angeben der Inhalts-URL

Widget-Anbieter übergeben eine JSON-Nutzlast an das Widgets Board, indem sie einen Aufruf an WidgetManager.UpdateWidget durchführen. Für ein Web-Widget sollten Sie anstelle eines body-Objekts, das den Widget-Inhalt definiert, ein leeres body-Objekt angeben und stattdessen ein Metadaten-Objekt mit einem webUrl-Feld einschließen, das auf die URL verweist, die den HTML-Inhalt für das Widget bereitstellt.

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

Umgang mit Ressourcenanforderungen

Widget-Anbieter können einen WebRequest-Filter-String für ein Widget in der WebRequestFilter-Eigenschaft des Definition-Elements in der Paketmanifestdatei des Anbieters angeben. Immer wenn der Widget-Inhalt eine Ressource über eine URI anfordert, die dem Filter entspricht, wird die Anfrage abgefangen und an die Implementierung des Anbieters von IWidgetResourceProvider.OnResourceRequested weitergeleitet.

Das Filtermuster wird im Format ausgedrückt, das in Match Patterns beschrieben ist. Die Filterzeichenfolge in der Registrierung muss Punycode verwenden, wo dies erforderlich ist. Alle Inhaltstypen werden umgeleitet, wenn sie übereinstimmen, daher sollte der Filter nur auf Inhalte aufgelöst werden, die über den IWidgetResourceProvider in der Anwendung abgerufen werden sollen. Weitere Informationen zum Paketmanifestformat für Widget-Anbieter finden Sie unter Widget provider package manifest XML format.

Um Ressourcenanforderungen zu verarbeiten, müssen Widgetanbieter die IWidgetResourceProvider Schnittstelle implementieren.

internal class WidgetProvider : IWidgetProvider, IWidgetResourceProvider

Bei der Implementierung der OnResourceRequested--Methode können Widgetanbieter die angeforderten Ressourcen bereitstellen, indem sie die WidgetResourceRequestedArgs.Response--Eigenschaft auf ein WidgetResourceResponse--Objekt festlegen, das die angeforderte Ressource enthält. Wenn die Ressource asynchron abgerufen wird, sollte der Anbieter eine Verschiebung anfordern, indem er WidgetResourceRequestedArgs.GetDeferral aufruft und die Verschiebung abschließt, sobald die Ressource bereitgestellt wurde.

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

Wenn der Anbieter keine Antwort auf das Objekt WidgetResourceRequestedArgs festgelegt hat, das an die Methode übergeben wird, ruft das System die Ressource aus dem Web ab. In diesem Fall kann der Anbieter die Headers-Eigenschaft des WidgetResourceRequestedArgs.Request-Objekts ändern, beispielsweise um Benutzerkontext oder Tokens bereitzustellen, und das System wird die aktualisierten Header verwenden, wenn die Ressource aus dem Web abgerufen wird.

Umgang mit Nachrichten zu und von Webinhalten

Um Zeichenfolgenmeldungen aus dem Inhalt des Widgets zu empfangen, der mithilfe der window.chrome.webview.postMessage JavaScript-Methode gepostet wurde, können Widgetanbieter die IWidgetProviderMessage--Schnittstelle implementieren und die OnMessageReceived--Methode implementieren.

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

Widgetanbieter können eine Nachricht an den Webinhalt des Widgets senden, indem sie WidgetManager.SendMessageaufrufen. Sie müssen die ID des Widgets angeben, an das die Nachricht gesendet wird. Dabei handelt es sich um den wert, der im attribut Id des Definition-Elements in der Paketmanifestdatei des Anbieters angegeben ist. Weitere Informationen finden Sie unter Widget provider package manifest XML format. Die Nachrichtenzeichenfolge kann einfacher Text oder die serialisierte Form eines Objekts sein, das von einer Webanwendung interpretiert wird. Weitere Informationen finden Sie unter PostWebMessageAsString.

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

Einschränkungen und Anforderungen

  • Dieses Feature ist nur für Benutzer im Europäischen Wirtschaftsraum (EWR) verfügbar. Im EWR können installierte Apps, die einen Feedanbieter implementieren, Inhaltsfeeds im Widgets Board bereitstellen.