Partilhar via


Fornecedores de widgets Web

Na versão mais recente, as aplicações que implementam widgets do Windows podem optar por preencher o conteúdo dos widgets com HTML servido a partir de uma URL remota. Anteriormente, o conteúdo do widget só podia ser fornecido no formato de esquema Adaptive Card no payload JSON que era passado do provedor para o Widgets Board. Como os fornecedores de widgets web devem continuar a fornecer um payload JSON de Cartão Adaptativo, deve seguir os passos para implementar um fornecedor de widgets em Implemente um fornecedor de widgets num C# Windows App ou Implemente um fornecedor de widgets numa aplicação win32 (C++/WinRT).

Especifique o URL do conteúdo

Os fornecedores de widgets transmitem um payload JSON ao Painel de Widgets com uma chamada para o WidgetManager.UpdateWidget. Para um widget web, em vez de fornecer um objeto corpo a definir o conteúdo do widget, deve especificar um objeto corpo vazio e incluir um objeto de metadados com um campo webUrl que aponte para a URL que fornecerá o conteúdo HTML do widget.

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

Lidar com solicitações de recursos

Os fornecedores de widgets podem especificar uma string de filtro de pedido web para um widget no atributo WebRequestFilter do elemento Definition no ficheiro de manifesto do pacote do fornecedor. Sempre que o conteúdo do widget solicita um recurso por URI que corresponda ao filtro, o pedido será interceptado e redirecionado para a implementação do fornecedor do widget do IWidgetResourceProvider.OnResourceRequested.

O padrão de filtro é expresso usando o formato descrito em Modelos de Correspondência. A cadeia de filtro no registo deve usar Punycode quando necessário. Todos os tipos de conteúdo serão redirecionados quando identificados, pelo que o filtro deve corresponder apenas ao conteúdo obtido através de IWidgetResourceProvider na aplicação. Para mais informações sobre o formato do manifesto do pacote do fornecedor de widgets, veja Formato XML do manifesto do pacote do fornecedor de widgets.

Para gerir pedidos de recursos, os fornecedores de widgets devem implementar a interface IWidgetResourceProvider .

internal class WidgetProvider : IWidgetProvider, IWidgetResourceProvider

Na implementação do método OnResourceRequested , os fornecedores de widgets podem fornecer os recursos solicitados definindo a propriedade WidgetResourceRequestedArgs.Response para um objeto WidgetResourceResponse contendo o recurso solicitado. Ao obter o recurso de forma assíncrona, o fornecedor deve solicitar um adiamento ligando para WidgetResourceRequestedArgs.GetDeferral e depois concluir o adiamento quando o recurso estiver definido.

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

Se o fornecedor não definir uma resposta no objeto WidgetResourceRequestedArgs passado no método, o sistema irá recuperar o recurso da web. Neste caso, o fornecedor pode optar por modificar a propriedade Headers do objeto WidgetResourceRequestedArgs.Request , como fornecer contexto do utilizador ou tokens, e o sistema usará os cabeçalhos atualizados ao recuperar o recurso da web.

Gerenciar envio e receção de mensagens para e de conteúdos web

Para receber mensagens de texto do conteúdo do widget que foi publicado usando o método JavaScript window.chrome.webview.postMessage, os fornecedores de widgets podem implementar a interface IWidgetProviderMessage e implementar o método OnMessageReceived.

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

Os fornecedores de widgets podem enviar uma mensagem para o conteúdo web do widget ligando para WidgetManager.SendMessage. Deve fornecer o ID do widget para o qual a mensagem é enviada, que é o valor especificado no atributo Id do elemento Definition no ficheiro manifesto do pacote do fornecedor. Para mais informações, veja Formato XML do manifesto do pacote fornecedor de widgets. A cadeia de caracteres de mensagem pode ser texto simples ou a forma serializada de um objeto interpretado pelo conteúdo da Web. Para mais informações, consulte PostWebMessageAsString.

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

Limitações e requisitos

  • Esta funcionalidade está disponível apenas para utilizadores no Espaço Económico Europeu (EEE). No EEE, as aplicações instaladas que implementam um provedor de feed podem fornecer um feed de conteúdo no Painel de Widgets.