次の方法で共有


通知チャネルを要求、作成、保存する方法

アプリがプッシュ通知を受信できるチャネル Uniform Resource Identifier (URI) を開くことができます。 その後、プッシュ通知を送信するために使用されるチャネルをサーバーに送信し、必要なくなったら閉じます。 チャネルは、特定のアプリまたはセカンダリ タイルの 1 つのデバイス上の 1 人のユーザーを表す一意のアドレスです。

アプリが起動されるたびに新しいチャネルを要求し、URI が変更されたときにクラウド サーバーを更新する必要があります。 詳細については、「解説」を参照してください。

Important

通知チャネルは、30 日後に自動的に期限切れになります。

知っておくべきこと

Technologies

  • Windows ランタイム

Prerequisites

Instructions

手順 1: 名前空間宣言を追加する

Windows.UI.Notifications にはトースト API が含まれています。

using Windows.UI.Notifications;
using Windows.Data.Xml.Dom;
using Windows.Networking.PushNotifications;

手順 2: チャネル URI を要求する

この例では、チャネル URI を要求します。 要求は Notification Client Platform に対して行われ、WNS からチャネル URI が要求されます。 要求が完了すると、返される値は URI を含む PushNotificationChannel オブジェクトです。

PushNotificationChannel channel = null;

try
{
    channel = await PushNotificationChannelManager.CreatePushNotificationChannelForApplicationAsync();
}

catch (Exception ex)
{ 
    // Could not create a channel. 
}

手順 3: チャネル URI をサーバーに送信する

チャネル URI は HTTP POST 要求にパッケージ化され、サーバーに送信されます。

Important

この情報は、セキュリティで保護された方法でサーバーに送信する必要があります。 アプリがチャネル URI を送信するときに、サーバーで自身を認証する必要があります。 情報を暗号化し、HTTPS などのセキュリティで保護されたプロトコルを使用します。

String serverUrl = "http://www.contoso.com";

// Create the web request.
HttpWebRequest webRequest = (HttpWebRequest)HttpWebRequest.Create(serverUrl);
webRequest.Method = "POST";
webRequest.ContentType = "application/x-www-form-urlencoded";
byte[] channelUriInBytes = System.Text.Encoding.UTF8.GetBytes("ChannelUri=" + channel.Uri);

// Write the channel URI to the request stream.
Stream requestStream = await webRequest.GetRequestStreamAsync();
requestStream.Write(channelUriInBytes, 0, channelUriInBytes.Length);

try
{
    // Get the response from the server.
    WebResponse response = await webRequest.GetResponseAsync();
    StreamReader requestReader = new StreamReader(response.GetResponseStream());
    String webResponse = requestReader.ReadToEnd();
}

catch (Exception ex)
{
    // Could not send channel URI to server.
}

Remarks

Requesting channels

次のロジックを使用して、アプリが呼び出されるたびに新しいチャネルを要求する必要があります。

  1. チャネルを要求します。
  2. 新しいチャネルを以前のチャネルと比較します。 チャネルが同じ場合は、それ以上のアクションを実行する必要はありません。 そのためには、アプリがサービスにチャネルを正常に送信するたびにローカルにチャネルを格納する必要があります。これにより、後で比較するチャネルが作成されます。
  3. チャネルが変更された場合は、新しいチャネルを Web サービスに送信します。 次の場合は、常に新しいチャネルを送信するエラー処理ロジックを含めます。
    • アプリが Web サービスにチャネルを送信したことがない。
    • アプリが最後にチャネルを Web サービスに送信できませんでした。

CreatePushNotificationChannelForApplicationAsync メソッドの呼び出しが異なると、常に異なるチャネルが返されるわけではありません。 前回の呼び出し以降にチャネルが変更されていない場合、アプリは、同じチャネルをサービスに再送信しないことで、労力とインターネット トラフィックを節約する必要があります。 アプリは、複数の有効なチャネル URI を同時に持つことができます。 各一意のチャネルは有効期限が切れるまで有効なままであるため、以前のチャネルの有効期限には影響しないため、新しいチャネルを要求しても問題はありません。

アプリが呼び出されるたびに新しいチャネルを要求することで、常に有効なチャネルにアクセスできる可能性が最大になります。 コンテンツが常にライブであることがタイルまたはトーストのシナリオにとって不可欠な場合には、これが特に重要です。 ユーザーが 30 日に 1 回以上アプリを実行しないことが懸念される場合は、バックグラウンド タスクを実装して、チャネル要求コードを定期的に実行できます。

チャネル要求でのエラーの処理

インターネットが利用できない場合、 CreatePushNotificationChannelForApplicationAsync メソッドの呼び出しが失敗する可能性があります。 これを処理するには、手順 2 で示すコードに再試行ロジックを追加します。 失敗した試行の間に 10 秒の遅延を伴う 3 回の試行をお勧めします。 3 回の試行がすべて失敗した場合、アプリは次回ユーザーが起動して再試行するまで待機する必要があります。

Closing channels

アプリは、PushNotificationChannel.Close メソッドを呼び出すことによって、すべてのチャネルでの通知の配信を直ちに停止できます。 アプリでこれを行うのは一般的ではありませんが、アプリへのすべての通知配信を停止するシナリオが存在する場合があります。 たとえば、アプリにユーザー アカウントの概念があり、ユーザーがそのアプリからログアウトした場合、タイルにそのユーザーの個人情報が表示されなくなることを期待するのが妥当です。 コンテンツのタイルを正常にクリアし、通知の配信を停止するには、次の操作を行う必要があります。

  1. タイル、トースト、バッジ、または生の通知をユーザーに配信している通知チャネルで、PushNotificationChannel.Close メソッドを呼び出して、すべてのタイルの更新を停止します。 Close メソッドを呼び出すと、そのユーザーに対するそれ以上の通知をクライアントに配信できなくなります。
  2. TileUpdater.Clear メソッドを呼び出してタイルの内容をクリアし、前のユーザーのデータをタイルから削除します。