Provedores de widget web
Na versão mais recente, os aplicativos que implementam widgets do Windows podem optar por preencher o conteúdo do widget com HTML servido de uma URL remota. Anteriormente, o conteúdo do widget só podia ser fornecido no formato de esquema de Cartão Adaptável no conteúdo JSON passado do provedor para o Widgets Board. Como os provedores de widget Web ainda devem fornecer um conteúdo JSON de Cartão Adaptável, você deve seguir as etapas para implementar um provedor de widget em Implementar um provedor de widget em um Aplicativo do Windows em C# ou Implementar um provedor de widget em um aplicativo win32 (C++/WinRT).
Especificar a URL de conteúdo
Os provedores de widget passam um conteúdo JSON para o Widgets Board com uma chamada para WidgetManager.UpdateWidget. Para um widget web, em vez de fornecer um objeto corpo definindo o conteúdo do widget, você deve especificar um objeto corpo vazio e, em vez disso, incluir um objeto metadados com um campo webUrl que aponta para a URL que fornecerá o conteúdo HTML para o 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 recurso
Os provedores de widget podem especificar uma string de filtro de requisição web para um widget no atributo WebRequestFilter do elemento Definição no arquivo de manifesto do pacote do provedor. Sempre que o conteúdo do widget solicitar um recurso por URI que corresponda ao filtro, a solicitação será interceptada e redirecionada para a implementação do provedor de widget de IWidgetResourceProvider.OnResourceRequested.
O padrão de filtro é expresso usando o formato descrito em Padrões de correspondência. A cadeia de caracteres de filtro no registro deve usar Punycode quando necessário. Todos os tipos de conteúdo serão redirecionados quando correspondidos, portanto, o filtro só deve ser resolvido para o conteúdo destinado a ser obtido por meio de IWidgetResourceProvider no aplicativo. Para obter mais informações sobre o formato de manifesto do pacote do provedor de widget, consulte formato XML do manifesto do pacote do provedor widget.
Para lidar com solicitações de recursos, os provedores de widget devem implementar a interface IWidgetResourceProvider.
internal class WidgetProvider : IWidgetProvider, IWidgetResourceProvider
Na implementação do método OnResourceRequested, os provedores de widget podem fornecer os recursos solicitados definindo a propriedade WidgetResourceRequestedArgs.Response para um objeto WidgetResourceResponse que contém o recurso solicitado. Ao obter o recurso de forma assíncrona, o provedor deve solicitar um adiamento chamando WidgetResourceRequestedArgs.GetDeferral e, em seguida, concluir o adiamento quando o recurso tiver sido 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 provedor não definir uma resposta no widgetResourceRequestedArgs objeto passado para o método, o sistema recuperará o recurso da Web. Nesse caso, o provedor pode optar por modificar a propriedade Headers do objeto WidgetResourceRequestedArgs.Request, como fornecer contexto de usuário ou tokens, e o sistema usará os cabeçalhos atualizados ao recuperar o recurso da Web.
Manipular mensagens de e para o conteúdo da Web
Para receber mensagens de texto do conteúdo do widget que foi postado usando o método JavaScript window.chrome.webview.postMessage, os provedores de widget podem implementar a interface IWidgetProviderMessage e 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 provedores de widget podem enviar uma mensagem para o conteúdo da Web do widget chamando WidgetManager.SendMessage. Você deve fornecer a ID do widget para o qual a mensagem é enviada, que é o valor especificado no atributo de Id do elemento de Definição no arquivo de manifesto do pacote do provedor. Para obter mais informações, consulte Formato XML do manifesto do pacote do provedor de widget. A cadeia de caracteres de mensagem pode ser texto simples ou a forma serializada de um objeto interpretado pelo conteúdo da Web. Para obter mais informações, consulte PostWebMessageAsString.
var message = $"{{ \"current_location\": \"{ location }\" }}";
WidgetManager.GetDefault().SendMessageToContent("Weather_Widget", message);
Limitações e requisitos
- Esse recurso está disponível apenas para usuários da Área Econômica Europeia (EEE). No EEE, os aplicativos instalados que implementam um provedor de feed podem fornecer conteúdo para o Painel de Widgets.
Windows developer