最新リリースでは、Windows ウィジェットを実装するアプリは、リモート URL から提供される HTML をウィジェットのコンテンツに設定することを選択できます。 以前は、ウィジェットのコンテンツは、プロバイダーから Widgets Board に渡される JSON ペイロードのアダプティブ カード スキーマ形式でのみ提供できました。 Web ウィジェット プロバイダーは引き続きアダプティブ カード JSON ペイロードを提供する必要があるため、「 C# Windows アプリでウィジェット プロバイダーを実装 する」または win32 アプリ (C++/WinRT) でウィジェット プロバイダーを実装する手順に従う必要があります。
コンテンツ URL を指定する
ウィジェット プロバイダーは、 WidgetManager.UpdateWidget を呼び出して JSON ペイロードを Widgets Board に渡します。 Web ウィジェットの場合、ウィジェットのコンテンツを定義する本文オブジェクトを指定する代わりに、空の本文オブジェクトを指定し、代わりに、ウィジェットの HTML コンテンツを提供する URL を指す webUrl フィールドを持つメタデータ オブジェクトを含める必要があります。
{
"type": "AdaptiveCard",
"$schema": "http://adaptivecards.io/schemas/adaptive-card.json",
"version": "1.6",
"body": [],
"metadata":
{
"webUrl": "https://www.contoso.com/widgetprovider.html"
}
}
リソース要求の処理
ウィジェット プロバイダーは、プロバイダーのパッケージ マニフェスト ファイルの Definition 要素の WebRequestFilter 属性で、ウィジェットの Web 要求フィルター文字列を指定できます。 ウィジェット コンテンツがフィルターに一致する 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 オブジェクトに対する応答を設定しない場合、システムは Web からリソースを取得します。 この場合、プロバイダーは WidgetResourceRequestedArgs.Request オブジェクトの Headers プロパティ (ユーザー コンテキストやトークンの提供など) を変更することを選択でき、システムは Web からリソースを取得するときに更新されたヘッダーを使用します。
Web コンテンツとの間でメッセージを処理する
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 を呼び出すことによって、ウィジェットの Web コンテンツにメッセージを送信できます。 メッセージの送信先のウィジェットの ID を指定する必要があります。これは、プロバイダーのパッケージ マニフェスト ファイルの Definition 要素の Id 属性で指定された値です。 詳細については、「 ウィジェット プロバイダー パッケージ マニフェスト XML 形式」を参照してください。 メッセージ文字列には、単純なテキストまたは Web コンテンツによって解釈されるオブジェクトのシリアル化された形式を指定できます。 詳細については、「 PostWebMessageAsString」を参照してください。
var message = $"{{ \"current_location\": \"{ location }\" }}";
WidgetManager.GetDefault().SendMessageToContent("Weather_Widget", message);
制限事項と要件
- この機能は、欧州経済地域 (EEA) のユーザーのみが使用できます。 EEA では、フィード プロバイダーを実装するインストール済みアプリは、Widgets Board でコンテンツ フィードを提供できます。
Windows developer