次の方法で共有


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

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

アプリが起動されるたびに新しいチャネルを要求し、URI が変更されたらクラウド サーバーを更新する必要があります。 詳しくは、「注釈」をご覧ください。

重要

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

知っておくべきこと

テクノロジ

  • Windows ランタイム

前提条件

手順

ステップ 1: 名前空間の宣言を追加する

Windows.UI.Notifications にはトースト API が存在します。

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

ステップ 2: チャネルの URI を要求する

この例では、チャネルの URI を要求します。 要求は通知クライアント プラットフォームに対して行われ、そこからさらに 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 要求にパッケージ化されて、サーバーに送信されます。

重要

この情報は、セキュリティ保護された方法でサーバーに送信する必要があります。 チャネルの 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.
}

注釈

チャネルの要求

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

  1. チャネルを要求します。
  2. 新しいチャネルを前のチャネルと比較します。 チャネルが同じ場合は、それ以上何もする必要はありません。 そのためには、後でチャネルを比較できるよう、アプリによってチャネルがサービスに正常に送信されるたびに、アプリでチャネルをローカル環境に保存する必要があります。
  3. チャネルが変更された場合は、新しいチャネルを Web サービスに送信します。 次の場合は、常に新しいチャネルを送信するエラー処理ロジックを含めます。
    • アプリから Web サービスにチャネルを送信したことがない。
    • アプリによる Web サービスへのチャネルの送信の最後の試みが成功しなかった。

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

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

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

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

チャネルを閉じる

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

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