アプリ通知とは、アプリを使用していないときに、アプリが構築しユーザーに配信できるメッセージです。
このクイック スタートでは、リッチ コンテンツと対話型アクションを使用して Windows 10 または Windows 11 アプリ通知を作成、配信、表示する手順について説明します。 このクイック スタートでは、実装する最も簡単な通知であるローカル通知を使用します。 すべての種類のアプリ (WPF、UWP、WinForms、コンソール) から通知を送信できます。
Note
"トースト通知" という用語は、"アプリ通知" に置き換えられます。 これらの用語はどちらも Windows の同じ機能を指しますが、時間の経過と共に、ドキュメントでの "トースト通知" の使用を段階的に廃止します。
手順 1: NuGet パッケージをインストールする
Visual Studio ソリューション内でプロジェクトを右クリックし、[NuGet パッケージの管理...] をクリックし、 Microsoft.Toolkit.Uwp.NotificationsNuGet パッケージ バージョン 7.0 以降を検索してインストールします。
Important
packages.config を引き続き使用する .NET Framework デスクトップ アプリは PackageReference に移行する必要があります。そうしないと、Windows SDK は正しく参照されません。 プロジェクトで [参照] を右クリックし、[packages.config を PackageReference に移行する] をクリックします。
.NET Core 3.0 WPF アプリは、.NET Core 3.1 に更新する必要があります。そうしないと、API は存在しません。
.NET アプリでは 、Windows TFM のいずれかを使用する必要があります。そうしないと、 Show() などのアプリ通知の送信および管理 API が見つかりません。 TFM を net6.0-windows10.0.17763.0 以降に設定します。
このコード サンプルでは、このパッケージを使用します。 このパッケージを使用すると、XML を使用せずにアプリ通知を作成したり、デスクトップ アプリからアプリ通知を送信したりできます。
手順 2: アプリ通知を送信する
Windows 10 と Windows 11 では、アプリ通知コンテンツはアダプティブ言語を使用して記述されます。これにより、通知の外観を柔軟に変更できます。 詳細については、 アプリ通知コンテンツ のドキュメントを参照してください。
まず、単純なテキストベースの通知から始めます。 (Notifications ライブラリを使用して) 通知コンテンツを構築し、通知を表示します。 名前空間が Microsoft.Toolkit.Uwp.Notifications である点に注意してください。
// Requires Microsoft.Toolkit.Uwp.Notifications NuGet package version 7.0 or greater
new ToastContentBuilder()
.AddArgument("action", "viewConversation")
.AddArgument("conversationId", 9813)
.AddText("Andrew sent you a picture")
.AddText("Check this out, The Enchantments in Washington!")
.Show(); // Not seeing the Show() method? Make sure you have version 7.0, and if you're using .NET 6 (or later), then your TFM must be net6.0-windows10.0.17763.0 or greater
このコードを実行してみると、通知が表示されます。
手順 3: アクティベーションを処理する
通知を表示した後、ほとんどの場合、ユーザーによる通知のクリックを処理する必要があります (ユーザーがクリックした後に特定のコンテンツを表示する、通常はアプリを開く、ユーザーが通知をクリックしたときにアクションを実行するなど)。
アクティブ化を処理する手順は、UWP と、パッケージ化されたデスクトップ アプリとパッケージ化されていないデスクトップ アプリでは異なります。
まず、Package.appxmanifest で以下を追加します。
- xmlns:com の宣言
- xmlns:desktop の宣言
- IgnorableNamespaces 属性で、com と デスクトップ が無視されます。
- windows.toastNotificationActivation
の desktop:Extension を して、トースト アクティベーター CLSID を宣言します (任意の新しい GUID を使用)。 - MSIX のみ: 手順 4 の GUID を使用して COM アクティベーターの com:Extension を
します。 通知から起動されたことがわかるように、必ず Arguments="-ToastActivated"を含めます
Package.appxmanifest
<!--Add these namespaces-->
<Package
...
xmlns:com="http://schemas.microsoft.com/appx/manifest/com/windows10"
xmlns:desktop="http://schemas.microsoft.com/appx/manifest/desktop/windows10"
IgnorableNamespaces="... com desktop">
...
<Applications>
<Application>
...
<Extensions>
<!--Specify which CLSID to activate when toast clicked-->
<desktop:Extension Category="windows.toastNotificationActivation">
<desktop:ToastNotificationActivation ToastActivatorCLSID="replaced-with-your-guid-C173E6ADF0C3" />
</desktop:Extension>
<!--Register COM CLSID LocalServer32 registry key-->
<com:Extension Category="windows.comServer">
<com:ComServer>
<com:ExeServer Executable="YourProject\YourProject.exe" Arguments="-ToastActivated" DisplayName="Toast activator">
<com:Class Id="replaced-with-your-guid-C173E6ADF0C3" DisplayName="Toast activator"/>
</com:ExeServer>
</com:ComServer>
</com:Extension>
</Extensions>
</Application>
</Applications>
</Package>
次に、アプリのスタートアップコード () の (WPF の App.xaml.cs の OnStartup) で、OnActivated イベントをサブスクライブします。
// Listen to notification activation
ToastNotificationManagerCompat.OnActivated += toastArgs =>
{
// Obtain the arguments from the notification
ToastArguments args = ToastArguments.Parse(toastArgs.Argument);
// Obtain any user input (text boxes, menu selections) from the notification
ValueSet userInput = toastArgs.UserInput;
// Need to dispatch to UI thread if performing UI operations
Application.Current.Dispatcher.Invoke(delegate
{
// TODO: Show the corresponding content
MessageBox.Show("Toast activated. Args: " + toastArgs.Argument);
});
};
ユーザーが通知 (または通知のボタン) をクリックすると、次のことが発生します。
アプリが現在実行されている場合...
- バックグラウンド スレッドで ToastNotificationManagerCompat.OnActivated イベントが呼び出されます。
アプリが現在閉じられている場合
- アプリの EXE が起動され、
ToastNotificationManagerCompat.WasCurrentProcessToastActivated()から true が返されます。これは、最新のアクティブ化によってプロセスが開始されたこと、およびイベント ハンドラーが間もなく呼び出されることを示しています。 - 次に、バックグラウンド スレッドで ToastNotificationManagerCompat.OnActivated イベントが呼び出されます。
手順 4: アンインストールを処理する
何もする必要はありません。 MSIX アプリがアンインストールされると、すべての通知とその他の関連リソースが自動的にクリーンアップされます。
イメージを追加する
通知にリッチ コンテンツを追加できます。 インライン イメージとプロファイル (アプリ ロゴのオーバーライド) イメージを追加します。
Note
イメージは、アプリのパッケージ、アプリのローカル ストレージ、または Web から使用できます。 Fall Creators Update の時点では、通常の接続では最大 3 MB、従量制課金接続では 1 MB の Web イメージを使用できます。 Fall Creators Update をまだ実行していないデバイスでは、Web イメージは 200 KB 以下にする必要があります。
Important
Http イメージは、マニフェストにインターネット機能があるパッケージ アプリでのみサポートされます。 パッケージ化されていないアプリは http イメージをサポートしていません。イメージをローカル アプリ データにダウンロードし、ローカルで参照する必要があります。
// Construct the content and show the toast!
new ToastContentBuilder()
...
// Inline image
.AddInlineImage(new Uri("https://picsum.photos/360/202?image=883"))
// Profile (app logo override) image
.AddAppLogoOverride(new Uri("ms-appdata:///local/Andrew.jpg"), ToastGenericAppLogoCrop.Circle)
.Show();
ボタンと入力を追加する
ボタンと入力を追加して、通知を対話形式にすることができます。 ボタンは、フォアグラウンド アプリ、プロトコル、またはバックグラウンド タスクを起動できます。 返信テキスト ボックス、"いいね" ボタン、画像を開く [表示] ボタンを追加します。
int conversationId = 384928;
// Construct the content
new ToastContentBuilder()
.AddArgument("conversationId", conversationId)
...
// Text box for replying
.AddInputTextBox("tbReply", placeHolderContent: "Type a response")
// Buttons
.AddButton(new ToastButton()
.SetContent("Reply")
.AddArgument("action", "reply")
.SetBackgroundActivation())
.AddButton(new ToastButton()
.SetContent("Like")
.AddArgument("action", "like")
.SetBackgroundActivation())
.AddButton(new ToastButton()
.SetContent("View")
.AddArgument("action", "viewImage")
.AddArgument("imageUrl", image.ToString()))
.Show();
前景ボタンのアクティブ化は、メイン通知本文と同じ方法で処理されます (App.xaml.cs OnActivated が呼び出されます)。
ボタンが上記のように AddArgument API を使用している限り(ボタンに引数をカスタム割り当てる場合、最上位レベルの引数は含まれません)、ボタンがクリックされると、最上位レベルのアプリ通知 (会話 ID など) に追加された引数も返されることに注意してください。
バックグラウンドのアクティブ化を処理する
デスクトップ アプリケーションの場合、バックグラウンドのアクティブ化はフォアグラウンドのアクティブ化と同様に処理されます (OnActivated イベント ハンドラーがトリガーされます)。 アクティブ化を処理した後、UI を表示せずに、アプリを閉じることもできます。
有効期限を設定する
Windows 10 では、すべてのアプリ通知は、ユーザーによって無視または無視された後にアクション センターに送信されるため、ユーザーはポップアップが消えた後に通知を確認できます。
ただし、通知内のメッセージが一定期間だけ関連する場合は、アプリからの古い情報がユーザーに表示されないように、アプリ通知に有効期限を設定する必要があります。 たとえば、プロモーションが 12 時間のみ有効な場合は、有効期限を 12 時間に設定します。 次のコードでは、有効期限を 2 日に設定しています。
Note
ローカル アプリ通知の既定の有効期限と最大有効期限は 3 日間です。
// Create toast content and show the toast!
new ToastContentBuilder()
.AddText("Expires in 2 days...")
.Show(toast =>
{
toast.ExpirationTime = DateTime.Now.AddDays(2);
});
通知の主キーを指定する
送信した通知をプログラムで削除または置き換える場合は、Tag プロパティ (および必要に応じて Group プロパティ) を使用して、通知の主キーを指定する必要があります。 その後、この主キーを今後使用して、通知を削除または置き換えることができます。
既に配信されているアプリ通知の置換または削除の詳細については、「 クイック スタート: アクション センター (XAML) でのトースト通知の管理」を参照してください。
タグとグループの組み合わせは、複合主キーとして機能します。 Group はより汎用的な識別子であり、"wallPosts"、"messages"、"friendRequests" などのグループを割り当てることができます。タグは、グループ内から通知自体を一意に識別する必要があります。 汎用グループを使用すると、 RemoveGroup API を使用してそのグループからすべての通知を削除できます。
// Create toast content and show the toast!
new ToastContentBuilder()
.AddText("New post on your wall!")
.Show(toast =>
{
toast.Tag = "18365";
toast.Group = "wallPosts";
});
通知をクリアする
アプリは、独自の通知を削除およびクリアする役割を担います。 アプリが起動されると、通知は自動的にクリアされません。
Windows では、ユーザーが明示的に通知をクリックした場合にのみ、通知が自動的に削除されます。
メッセージング アプリで実行する必要がある操作の例を次に示します。...
- ユーザーは、会話内の新しいメッセージに関する複数のアプリ通知を受け取ります。
- ユーザーは、これらの通知のいずれかをタップして会話を開きます。
- アプリは会話を開き、その会話のすべての通知をクリアします (その会話に対してアプリが提供するグループで RemoveGroup を使用します)。
- ユーザーのアクション センターで通知の状態が正しく反映されるようになりました。アクション センターには、その会話の古い通知が残っていないためです。
すべての通知のクリアまたは特定の通知の削除については、「 Quickstart: アクション センター (XAML) でのトースト通知の管理」を参照してください。
ToastNotificationManagerCompat.History.Clear();
Resources
- GitHubで完全なコードサンプルを参照してください
- アプリ通知コンテンツのドキュメント
- ToastNotification クラス
- ToastNotificationActivatedEventArgs クラス
Windows developer