Примечание.
Для доступа к этой странице требуется авторизация. Вы можете попробовать войти или изменить каталоги.
Для доступа к этой странице требуется авторизация. Вы можете попробовать изменить каталоги.
Вы можете заполнить виджет Windows HTML-контентом, получаемым по URL-адресу, а не определять его содержимое с помощью Adaptive Cards. Ваш поставщик по-прежнему предоставляет JSON-пакет адаптивной карточки, указывающий URL-адрес содержимого. Начните с реализации поставщика виджета в приложение для Windows C# или реализации поставщика виджета в приложении win32 (C++/WinRT), а затем добавьте возможности веб-содержимого, описанные здесь.
API-интерфейсы ресурсов и обмена сообщениями, описанные в этой статье, были представлены в Windows App SDK 1.6.3. Используйте поддерживаемый на данный момент стабильный выпуск из каналов выпуска Windows App SDK и проверьте на устройстве Windows 11 с хостом мини-приложения, поддерживающим веб-содержимое.
Примеры C# — это фрагменты для поставщика упакованных виджетов рабочего стола. Добавьте using Microsoft.Windows.Widgets.Providers; и using Windows.Storage.Streams; в исходный файл поставщика. Продолжайте реализовывать IWidgetProvider при добавлении IWidgetResourceProvider или IWidgetProviderMessage.
Укажите URL-адрес содержимого
Отправьте полезную нагрузку JSON с помощью метода WidgetManager.UpdateWidget. Укажите объект метаданных с полем webUrl , которое указывает на HTML-содержимое. Включите body адаптивной карточки в качестве резервного содержимого для узлов, которые не поддерживают загрузку веб-содержимого, а не оставляйте эти узлы с пустым мини-виджетом.
{
"type": "AdaptiveCard",
"$schema": "http://adaptivecards.io/schemas/adaptive-card.json",
"version": "1.6",
"body": [
{
"type": "TextBlock",
"text": "Open the app to view this content.",
"wrap": true
}
],
"metadata": {
"webUrl": "https://contoso.com/widgetprovider.html"
}
}
Свойство шаблона $host.isWebSupported указывает, поддерживает ли хост веб-содержимое. Используйте его, когда необходимо дополнительно адаптировать резервное представление. Дополнительные сведения см. в разделе свойства хоста мини-приложений Windows.
Обработка запросов ресурсов
Поставщики мини-приложений могут указать строку фильтра веб-запроса для мини-приложения в атрибуте WebRequestFilter элемента Definition в файле манифеста пакета поставщика. Когда содержимое мини-приложения запрашивает ресурс по URI, который соответствует фильтру, запрос будет перехвачен и перенаправлен на реализацию поставщика мини-приложений IWidgetResourceProvider.OnResourceRequested.
Шаблон фильтра использует формат, описанный в Match Patterns. При необходимости используйте Punycode . Фильтр должен соответствовать источнику веб-страницы, указанному в webUrl. Запросы для всех типов контента перенаправляются, если они соответствуют фильтру, поэтому ограничьте фильтр ресурсами, которые поддерживает ваш поставщик. Дополнительные сведения см. в формате XML манифеста пакета поставщика Widget.
Для обработки запросов ресурсов поставщики мини-приложений должны реализовать интерфейс IWidgetResourceProvider .
internal class WidgetProvider : IWidgetProvider, IWidgetResourceProvider
В OnResourceRequested задайте WidgetResourceRequestedArgs.Response значение WidgetResourceResponse, содержащее ресурс. В этом примере сопоставляется один запрошенный URL-адрес с упакованным изображением. Включите Assets\image.png в качестве содержимого в пакет приложения. RandomAccessStreamReference.CreateFromUri поддерживает схему ms-appx , поэтому можно создать ссылку на поток без ожидания поиска файла.
void IWidgetResourceProvider.OnResourceRequested(WidgetResourceRequestedArgs args)
{
if (args.Request.Uri == "https://contoso.com/logo-image")
{
var imageUri = new System.Uri("ms-appx:///Assets/image.png");
var content = RandomAccessStreamReference.CreateFromUri(imageUri);
var response = new WidgetResourceResponse(content, "OK", 200);
response.Headers.Add("Content-Type", "image/png");
args.Response = response;
}
}
В этом синхронном примере не требуется отложенная операция. Если реализация ожидает завершения асинхронной операции перед установкой ответа, вызовите GetDeferral до возврата обратного вызова и завершите его в блоке finally. Обрабатывайте и сообщайте об асинхронных сбоях в соответствии с политикой обработки ошибок приложения.
Если ответ не задан, система извлекает ресурс из Интернета. Вы можете изменить WidgetResourceRequest.Headers в args.Request до этого получения. Только добавьте учетные данные в запросы к источникам origin, которым вы доверяете; сопоставление фильтров не является авторизацией для отправки токена.
Обработка сообщений к веб-содержимому и от него
Чтобы получать строковые сообщения из содержимого мини-приложения, размещенного с помощью метода window.chrome.webview.postMessage JavaScript, поставщики мини-приложений могут реализовать интерфейс IWidgetProviderMessage и реализовать метод OnMessageReceived .
internal class WidgetProvider : IWidgetProvider, IWidgetProviderMessage
Добавьте обратный вызов в класс поставщика:
public void OnMessageReceived(WidgetMessageReceivedArgs args)
{
System.Console.WriteLine($"Message received from widget {args.WidgetContext.Id}: {args.Message}");
}
Отправьте сообщение веб-содержимому мини-приложения с помощью WidgetManager.SendMessageToContent. Передайте идентификатор экземпляра мини-приложения из WidgetContext.Id, а не идентификатор определения из манифеста пакета. Несколько экземпляров одного определения имеют разные идентификаторы экземпляров.
Вызовите следующий вспомогательный метод из обратного вызова поставщика, передав WidgetContext для целевого экземпляра, например контекст, полученный в CreateWidget или OnActionInvoked. Сериализуйте структурированные сообщения, а не создавайте JSON с интерполяцией строк, поэтому значения, содержащие кавычки или обратные косые черты, остаются допустимыми.
private static void SendLocationToWidget(WidgetContext widgetContext, string location)
{
string message = System.Text.Json.JsonSerializer.Serialize(
new { current_location = location });
WidgetManager.GetDefault().SendMessageToContent(widgetContext.Id, message);
}
Веб-содержимое получает сообщение в виде строки через событие объекта window.chrome.webviewmessage. При сериализации JSON, как в этом примере, разберите строку в веб-содержимом. Дополнительные сведения см. в статье PostWebMessageAsString и JavaScript API WebView2.
Ограничения и требования
Important
Эта функция доступна только пользователям в Европейской экономической зоне (EEA).
Связанные пути реализации
Поставщики веб-мини-приложений не являются поставщиками веб-каналов. Сведения о каналах панели мониторинга и региональных требованиях к ним см. в разделе «Панели мониторинга» и «Поставщики веб-каналов». Сведения об отдельном пути реализации манифеста PWA и service worker см. в разделе «Сборка виджетов на основе PWA».
Windows developer