Partager via


Fournisseurs de widgets web

Dans la dernière version, les applications qui implémentent des widgets Windows peuvent choisir de remplir le contenu du widget avec html servi à partir d’une URL distante. Auparavant, le contenu du widget ne pouvait être fourni que sous le format de schéma de carte adaptative dans la charge utile JSON passée du fournisseur vers le tableau des widgets. Étant donné que les fournisseurs de widgets web doivent toujours fournir une charge utile JSON de carte adaptative, vous devez suivre les étapes d’implémentation d’un fournisseur de widgets dans Implémenter un fournisseur de widgets dans une application Windows C# ou implémenter un fournisseur de widgets dans une application win32 (C++/WinRT).

Spécifier l’URL de contenu

Les fournisseurs de widgets passent une charge utile JSON au widgets Board avec un appel à WidgetManager.UpdateWidget. Pour un widget web, au lieu de fournir un objet corps définissant le contenu du widget, vous devez spécifier un objet corps vide et inclure plutôt un objet de métadonnées avec un champ webUrl qui pointe vers l’URL qui fournira le contenu HTML pour le widget.

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

Gérer les demandes de ressources

Les fournisseurs de widgets peuvent spécifier une chaîne de filtre de requête web pour un widget dans l’attribut WebRequestFilter de l’élément Definition dans le fichier manifeste du package du fournisseur. Chaque fois que le contenu du widget demande une ressource par URI qui correspond au filtre, la requête est interceptée et redirigée vers l’implémentation du fournisseur de widgets de IWidgetResourceProvider.OnResourceRequested.

Le modèle de filtre est exprimé à l’aide du format décrit dans Modèles de correspondance. La chaîne de filtre dans l’inscription doit utiliser Punycode si nécessaire. Tous les types de contenu sont redirigés lorsqu’ils sont mis en correspondance, de sorte que le filtre ne doit être résolu qu’en contenu destiné à être obtenu via iWidgetResourceProvider dans l’application. Pour plus d’informations sur le format de manifeste de package du fournisseur de widgets, consultez le format XML du manifeste du package du fournisseur de widgets.

Pour gérer les demandes de ressources, les fournisseurs de widgets doivent implémenter l’interface IWidgetResourceProvider .

internal class WidgetProvider : IWidgetProvider, IWidgetResourceProvider

Dans l’implémentation de la méthode OnResourceRequested , les fournisseurs de widgets peuvent fournir les ressources demandées en définissant la propriété WidgetResourceRequestedArgs.Response sur un objet WidgetResourceResponse contenant la ressource demandée. Lors de l’obtention de la ressource de façon asynchrone, le fournisseur doit demander un report en appelant WidgetResourceRequestedArgs.GetDeferral , puis terminer le report lorsque la ressource a été définie.

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 le fournisseur ne définit pas de réponse sur l’objet WidgetResourceRequestedArgs passé dans la méthode, le système récupère la ressource à partir du web. Dans ce cas, le fournisseur peut choisir de modifier la propriété Headers de l’objet WidgetResourceRequestedArgs.Request , par exemple pour fournir un contexte utilisateur ou des jetons, et le système utilise les en-têtes mis à jour lors de la récupération de la ressource à partir du web.

Gérer les messages vers et à partir du contenu web

Pour recevoir des messages de chaîne du contenu du widget publié à l’aide de la méthode JavaScript window.chrome.webview.postMessage , les fournisseurs de widgets peuvent implémenter l’interface IWidgetProviderMessage et implémenter la méthode OnMessageReceived .

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

Les fournisseurs de widgets peuvent envoyer un message au contenu web du widget en appelant WidgetManager.SendMessage. Vous devez fournir l’ID du widget auquel le message est envoyé, qui est la valeur spécifiée dans l’attribut Id de l’élément Definition dans le fichier manifeste du package du fournisseur. Pour plus d’informations, consultez le format XML du manifeste du package du fournisseur de widgets. La chaîne de message peut être un texte simple ou la forme sérialisée d’un objet interprété par le contenu web. Pour plus d’informations, consultez PostWebMessageAsString.

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

Limitations et exigences

  • Cette fonctionnalité est disponible uniquement pour les utilisateurs de l’Espace économique européen (EEE). Dans l’EEE, les applications installées qui implémentent un fournisseur de flux peuvent fournir un flux de contenu dans le Widgets Board.