Sdílet prostřednictvím


Poskytovatelé webových widgetů

V nejnovější verzi můžou aplikace, které implementují widgety Windows, naplnit obsah widgetu kódem HTML obsluhované ze vzdálené adresy URL. Dříve bylo možné obsah widgetu dodat pouze ve formátu schématu adaptivní karty v JSON payloadu předaném poskytovatelem na nástěnku widgetů. Vzhledem k tomu, že poskytovatelé webových widgetů musí stále poskytovat datovou část JSON adaptivní karty, měli byste postupovat podle pokynů pro implementaci poskytovatele widgetu v implementaci zprostředkovatele widgetu v aplikaci C# pro Windows nebo implementovat poskytovatele widgetu v aplikaci win32 (C++/WinRT).

Zadání adresy URL obsahu

Poskytovatelé widgetů předají datovou část JSON na panel Widgets s voláním widgetManager.UpdateWidget. U webového widgetu místo poskytnutí základního objektu definující obsah widgetu byste měli zadat prázdný základní objekt a místo toho zahrnout objekt metadat s polem webUrl , které odkazuje na adresu URL, která poskytne obsah HTML widgetu.

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

Zpracování požadavků na prostředky

Zprostředkovatelé widgetů mohou zadat řetězec filtru webového požadavku pro widget v atributu WebRequestFilterelementu Definition v souboru manifestu balíčku zprostředkovatele. Kdykoli obsah widgetu vyžaduje prostředek s identifikátorem URI, který odpovídá filtru, požadavek bude zachycen a přesměrován na implementaci IWidgetResourceProvider.OnResourceRequested poskytovatele widgetu.

Vzor filtru se vyjadřuje pomocí formátu popsaného ve vzorech shody. V případě potřeby musí řetězec filtru v registraci používat punycode . Všechny typy obsahu budou přesměrovány, jakmile dojde k shodě, takže filtr by měl směřovat pouze na obsah určený k získání prostřednictvím IWidgetResourceProvider v aplikaci. Další informace o formátu manifestu balíčku zprostředkovatele widgetu naleznete v tématu Formát XML manifestu balíčku zprostředkovatele widgetu.

Aby mohli poskytovatelé widgetů zpracovávat požadavky na prostředky, musí implementovat rozhraní IWidgetResourceProvider .

internal class WidgetProvider : IWidgetProvider, IWidgetResourceProvider

Při implementaci metody OnResourceRequested mohou zprostředkovatelé widgetů poskytnout požadované prostředky nastavením vlastnosti WidgetResourceRequestedArgs.Response na objekt WidgetResourceResponse, který obsahuje požadovaný prostředek. Při asynchronním získání prostředku by měl poskytovatel požádat o odložení voláním WidgetResourceRequestedArgs.GetDeferral a potom dokončit odložení, jakmile je prostředek nastaven.

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

Pokud poskytovatel nenastaví odpověď na objekt WidgetResourceRequestedArgs, který je předán do metody, systém načte prostředek z webu. V tomto případě může poskytovatel změnit vlastnost Headers objektu WidgetResourceRequestedArgs.Request, například za účelem poskytnutí kontextu uživatele nebo tokenů, a systém použije aktualizované hlavičky při načítání prostředku z webu.

Zpracování zpráv k a z webového obsahu

Chcete-li přijímat řetězcové zprávy z obsahu widgetu, který byl publikován pomocí window.chrome.webview.postMessage JavaScript metoda, zprostředkovatelé widgetu mohou implementovat IWidgetProviderMessage rozhraní a implementovat OnMessageReceived metoda.

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

Poskytovatelé widgetů mohou odeslat zprávu do webového obsahu widgetu voláním WidgetManager.SendMessage. Musíte zadat ID widgetu, do kterého se zpráva odešle, což je hodnota zadaná v atributu IDelementu Definition v souboru manifestu balíčku zprostředkovatele. Další informace naleznete v tématu Formát XML manifestu balíčku zprostředkovatele widgetu. Řetězec zprávy může být jednoduchý text nebo serializovaná forma objektu interpretovaného webovým obsahem. Další informace naleznete v tématu PostWebMessageAsString.

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

Omezení a požadavky

  • Tato funkce je k dispozici pouze uživatelům v Evropském hospodářském prostoru (EHP). V EHP můžou nainstalované aplikace, které implementují poskytovatele informačních kanálů, poskytovat informační kanál na nástěnce widgetů.