Delen via


Webwidget-aanbieders

In de nieuwste versie kunnen apps die Windows-widgets implementeren ervoor kiezen om de widgetinhoud te vullen met HTML die wordt geleverd via een externe URL. Voorheen kon de widgetinhoud alleen worden opgegeven in de Adaptive Card-schema-indeling in de JSON-payload die is doorgegeven van de provider aan het widgetbord. Omdat webwidgetproviders nog steeds een JSON-nettolading voor adaptieve kaart moeten leveren, moet u de stappen volgen voor het implementeren van een widgetprovider in een C# Windows-app of een widgetprovider implementeren in een win32-app (C++/WinRT).

De inhouds-URL opgeven

Widgetproviders geven een JSON-nettolading door aan het widgetsbord met een aanroep naar WidgetManager.UpdateWidget. Voor een webwidget moet u in plaats van een hoofdtekstobject op te geven dat de widgetinhoud definieert, een leeg hoofdobject opgeven en in plaats daarvan een metagegevensobject opnemen met een webUrl-veld dat verwijst naar de URL die de HTML-inhoud voor de widget levert.

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

Resourceaanvragen verwerken

Widgetproviders kunnen een filtertekenreeks voor webaanvragen opgeven voor een widget in het kenmerk WebRequestFilter van het definitie-element in het pakketmanifestbestand van de provider. Wanneer de widgetinhoud een resource aanvraagt op basis van een URI die overeenkomt met het filter, wordt de aanvraag onderschept en omgeleid naar de implementatie van de widgetprovider van IWidgetResourceProvider.OnResourceRequested.

Het filterpatroon wordt uitgedrukt met behulp van de indeling die wordt beschreven in Overeenkomstpatronen. De filtertekenreeks in de registratie moet waar nodig Punycode gebruiken. Alle inhoudstypen worden omgeleid wanneer deze overeenkomen, zodat het filter alleen moet oplossen naar inhoud die bedoeld is om verkregen te worden via de IWidgetResourceProvider in de toepassing. Zie de XML-indeling van het pakketmanifest van de widgetprovider voor meer informatie over de manifestindeling van het widgetproviderpakket.

Voor het afhandelen van resourceaanvragen moeten widgetproviders de interface IWidgetResourceProvider implementeren.

internal class WidgetProvider : IWidgetProvider, IWidgetResourceProvider

In de implementatie van de methode OnResourceRequested kunnen widgetproviders de aangevraagde resources opgeven door de eigenschap WidgetResourceRequestedArgs.Response in te stellen op een WidgetResourceResponse-object met de aangevraagde resource. Wanneer de resource asynchroon wordt opgehaald, moet de provider een uitstel aanvragen door WidgetResourceRequestedArgs.GetDeferral aan te roepen en vervolgens het uitstel te voltooien wanneer de resource is ingesteld.

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

Als de provider geen antwoord instelt op het WidgetResourceRequestedArgs-object dat is doorgegeven aan de methode, haalt het systeem de resource op van het web. In dit geval kan de provider ervoor kiezen om de eigenschap Headers van het object WidgetResourceRequestedArgs.Request te wijzigen, zoals gebruikerscontext of tokens, en het systeem gebruikt de bijgewerkte headers bij het ophalen van de resource van het web.

Berichten van en naar webinhoud verwerken

Als u tekenreeksberichten wilt ontvangen van de inhoud van de widget die is gepost met behulp van de methode window.chrome.webview.postMessage JavaScript , kunnen widgetproviders de interface IWidgetProviderMessage implementeren en de methode OnMessageReceived implementeren.

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

Widgetproviders kunnen een bericht verzenden naar de webinhoud van de widget door WidgetManager.SendMessage aan te roepen. U moet de id opgeven van de widget waarnaar het bericht wordt verzonden. Dit is de waarde die is opgegeven in het kenmerk Id van het element Definitie in het pakketmanifestbestand van de provider. Voor meer informatie, zie de XML-indeling van het pakketmanifest voor widgetaanbieder. De berichttekenreeks kan eenvoudige tekst zijn of de geserialiseerde vorm van een object dat wordt geïnterpreteerd door de webinhoud. Zie PostWebMessageAsString voor meer informatie.

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

Beperkingen en vereisten

  • Deze functie is alleen beschikbaar voor gebruikers in de Europese Economische Ruimte (EER). In de EER kunnen geïnstalleerde apps die een feedprovider implementeren inhoudsfeed in het widgetsbord leveren.