Compartir a través de


Proveedores de widgets web

En la versión más reciente, las aplicaciones que implementan widgets de Windows pueden optar por rellenar el contenido del widget con HTML servido desde una dirección URL remota. Anteriormente, el contenido del widget solo se podía proporcionar en el formato de esquema Adaptive Card en el payload JSON pasado del proveedor al panel de widgets. Dado que los proveedores de widgets web todavía deben proporcionar una carga JSON de tarjeta adaptable, debe seguir los pasos para implementar un proveedor de widgets en Implementar un proveedor de widgets en una aplicación de Windows de C# o Implementar un proveedor de widgets en una aplicación win32 (C++/WinRT).

Especificar la dirección URL de contenido

Los proveedores de widgets pasan una carga JSON al tablero de Widgets con una llamada a WidgetManager.UpdateWidget. Para un widget web, en lugar de proporcionar un objeto de cuerpo que defina el contenido del widget, debe especificar un objeto de cuerpo vacío y, en su lugar, incluir un objeto de metadatos con un campo webUrl que apunte a la dirección URL que proporcionará el contenido HTML para el widget.

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

Gestión de solicitudes de recursos

Los proveedores de widgets pueden especificar una cadena de filtro de solicitud web para un widget en el atributo WebRequestFilter del elemento Definition del archivo de manifiesto del paquete del proveedor. Siempre que el contenido del widget solicite un recurso por URI que coincida con el filtro, la solicitud se interceptará y redirigirá a la implementación del proveedor del widget de IWidgetResourceProvider.OnResourceRequested.

El patrón de filtro se expresa mediante el formato descrito en Patrones de coincidencia. La cadena de filtro del registro debe usar Punycode cuando sea necesario. Todos los tipos de contenido serán redirigidos cuando haya coincidencias, por lo que el filtro solo debe resolverse en el contenido destinado a ser obtenido a través del IWidgetResourceProvider en la aplicación. Para obtener más información sobre el formato del manifiesto del paquete del proveedor de widgets, vea Formato XML del manifiesto del paquete del proveedor de widgets.

Para controlar las solicitudes de recursos, los proveedores de widgets deben implementar la interfaz IWidgetResourceProvider .

internal class WidgetProvider : IWidgetProvider, IWidgetResourceProvider

En la implementación del método OnResourceRequested , los proveedores de widgets pueden proporcionar los recursos solicitados estableciendo la propiedad WidgetResourceRequestedArgs.Response en un objeto WidgetResourceResponse que contiene el recurso solicitado. Al obtener el recurso de forma asincrónica, el proveedor debe solicitar un aplazamiento llamando a WidgetResourceRequestedArgs.GetDeferral y, a continuación, completar el aplazamiento cuando se haya establecido el recurso.

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

Si el proveedor no establece una respuesta en el objeto WidgetResourceRequestedArgs pasado al método , el sistema recuperará el recurso de la web. En este caso, el proveedor puede elegir modificar la propiedad Headers del objeto WidgetResourceRequestedArgs.Request , como proporcionar el contexto de usuario o tokens, y el sistema usará los encabezados actualizados al recuperar el recurso de la web.

Controlar mensajes hacia y desde el contenido web

Para recibir mensajes de cadena del contenido del widget que se ha publicado mediante el método javaScript window.chrome.webview.postMessage , los proveedores de widgets pueden implementar la interfaz IWidgetProviderMessage e implementar el método OnMessageReceived .

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

Los proveedores de widgets pueden enviar un mensaje al contenido web del widget llamando a WidgetManager.SendMessage. Debe proporcionar el identificador del widget al que se envía el mensaje, que es el valor especificado en el atributo Id del elemento Definition del archivo de manifiesto del paquete del proveedor. Para obtener más información, vea Formato XML del manifiesto del paquete del proveedor de widgets. La cadena de mensaje puede ser texto simple o la forma serializada de un objeto interpretado por el contenido web. Para obtener más información, vea PostWebMessageAsString.

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

Limitaciones y requisitos

  • Esta característica solo está disponible para los usuarios del Espacio Económico Europeo (EEE). En el EEE, las aplicaciones instaladas que implementan un proveedor de fuentes pueden proporcionar fuentes de contenido en el Panel de widgets.