Поделиться через


Поставщики веб-мини-приложений

В последнем выпуске приложения, реализующие виджеты Windows, могут заполнять содержимое виджетов HTML, обслуживаемым из удаленного URL-адреса. Ранее содержимое мини-приложения могло быть предоставлено только в формате схемы адаптивной карты в полезных данных JSON, передаваемых поставщиком на Доску мини-приложений. Так как поставщики веб-мини-приложений по-прежнему должны предоставлять полезные данные JSON адаптивной карточки, необходимо выполнить действия по реализации поставщика мини-приложений в приложении C# для Windows или реализации поставщика мини-приложений в приложении win32 (C++/WinRT).

Укажите URL-адрес содержимого

Поставщики мини-приложений передают полезные данные JSON в Доску мини-приложений с вызовом WidgetManager.UpdateWidget. Для веб-мини-приложения вместо предоставления основного объекта, определяющего содержимое мини-приложения, следует указать пустой объект тела и вместо этого включить объект метаданных с полем webUrl, которое указывает на URL-адрес, который будет предоставлять HTML-содержимое для мини-приложения .

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

Обработка запросов ресурсов

Поставщики мини-приложений могут указать строку фильтра веб-запроса для мини-приложения в атрибуте WebRequestFilter элемента Definition в файле манифеста пакета поставщика. Когда содержимое мини-приложения запрашивает ресурс по URI, который соответствует фильтру, запрос будет перехвачен и перенаправлен на реализацию поставщика мини-приложений IWidgetResourceProvider.OnResourceRequested.

Шаблон фильтра задаётся в формате, который описан в шаблонах сопоставления. При необходимости строка фильтра в регистрации должна использовать Punycode. Все типы контента будут перенаправлены при сопоставлении, поэтому фильтр должен разрешаться только контенту, предназначенному для получения через IWidgetResourceProvider в приложении. Дополнительные сведения о формате манифеста пакета поставщика мини-приложений см. в формате XML манифеста пакета поставщика мини-приложений.

Для обработки запросов ресурсов поставщики мини-приложений должны реализовать интерфейс IWidgetResourceProvider .

internal class WidgetProvider : IWidgetProvider, IWidgetResourceProvider

В реализации метода OnResourceRequested поставщики мини-приложений могут предоставлять запрошенные ресурсы, задав свойству WidgetResourceRequestedArgs.Response объект WidgetResourceResponse , содержащий запрошенный ресурс. При асинхронном получении ресурса поставщик должен запросить отсрочку, вызвав WidgetResourceRequestedArgs.GetDeferral, а затем завершить ее, когда ресурс готов.

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

Если поставщик не задает ответ на объект WidgetResourceRequestedArgs , переданный в метод, система получит ресурс из Интернета. В этом случае поставщик может изменить свойство Headers объекта WidgetResourceRequestedArgs.Request , например предоставить контекст пользователя или маркеры, и система будет использовать обновленные заголовки при получении ресурса из Интернета.

Обработка сообщений к веб-содержимому и от него

Чтобы получать строковые сообщения из содержимого мини-приложения, размещенного с помощью метода window.chrome.webview.postMessage JavaScript, поставщики мини-приложений могут реализовать интерфейс IWidgetProviderMessage и реализовать метод OnMessageReceived .

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

Поставщики мини-приложений могут отправлять сообщение в веб-содержимое мини-приложения, вызвав WidgetManager.SendMessage. Необходимо указать идентификатор мини-приложения, в который отправляется сообщение, которое является значением, указанным в атрибуте Id элемента Definition в файле манифеста пакета поставщика. Для получения дополнительной информации см. формат XML манифеста пакета поставщика виджетов. Строка сообщения может быть простым текстом или сериализованной формой объекта, интерпретированного веб-содержимым. Дополнительные сведения см. в статье PostWebMessageAsString.

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

Ограничения и требования

  • Эта функция доступна только пользователям в Европейской экономической зоне (EEA). В странах ЕЭЗ установленные приложения, которые выступают в роли поставщика контентных лент, могут предоставлять ленты контента на Панели виджетов.