Windows Phone のプッシュ通知の受信

2012/02/09

Microsoft Push Notification Service を使用するには、Microsoft Push Notification Service からプッシュ通知を受信するように Windows Phone アプリケーションを設定する必要があります。プッシュ通知受信を実装するコードのサンプルについては、「方法: Windows Phone 用のトースト通知を送受信する」、「方法: Windows Phone 用のタイル通知を送受信する」、および「方法: Windows Phone 用の Raw 通知を送受信する」を参照してください。

プッシュ通知を受信するには、Windows Phone クライアント アプリケーションが次のとおりにする必要があります。

  • Windows Phone アプリケーション認定の要件」の「プッシュ通知アプリケーション」セクションおよび「アプリケーション ポリシー」のセクション 2.9 に記載されている要件に従っている必要があります。

  • プッシュ チャネルが存在しない場合はプッシュ チャネルを開き、存在する場合は既存のプッシュ チャネルに接続します。プッシュ チャネルが存在する可能性があるのは、そのアプリケーションを前回実行したときに作成された場合です。プッシュ チャネルがアプリケーションの終了後も保持されるのは、プッシュ チャネルがタイルまたはトースト通知にバインドされている場合です (アプリケーションが実行されていないときでも通知を受信できるようにするため)。

  • トースト通知を受信できるようにするには、BindToShellToast()()()() メソッドを呼び出してチャネルをトースト通知にバインドしてください。

  • タイル通知を受信できるようにするには、チャネルをタイル通知にバインドします。デバイスのローカル リソースにアクセスする場合は BindToShellTile()()()() メソッドを呼び出し、リモート リソースにアクセスする場合は BindToShellTile(Collection<(Of <<'(Uri>)>>)) メソッドを呼び出します。リモート リソースにアクセスするには、リモート イメージへのアクセスが許可されているドメインのコレクションを指定する必要があります。コレクションの各 URL の文字数は 256 文字以下です。

  • 受信したいイベントに登録します。すべてのアプリケーションを ChannelUriUpdated イベントに登録してください。これは、プッシュ通知の URI が変更された場合に備えるためです。チャネルが既に開いている場合でも、URI の変更に備えて ChannelUriUpdated に登録してください。

    すべてのアプリケーションを ErrorOccurred イベントに登録してください。これは、発生したエラーを処理するためです。

    Raw 通知を使用するアプリケーションは、通知から Raw データを受信するための HttpNotificationReceived イベントを実装する必要があります。

    アプリケーションが既に実行中の場合はトースト通知は無視されますが、これを防ぐには ShellToastNotificationReceived イベントに登録してください。登録すると、トースト通知にどのように応答するかをアプリケーションが決定できます。

  • アプリケーションが起動するたびに、プッシュ通知の送信元である Web サービスにプッシュ チャネルから URI を渡してください。また、デバイス ID も Web サービスに渡すことをお勧めします。このようにすると、URI がどのデバイスに割り当てられたかを Web サービスがトラッキングできるようになります。URI が変更された場合に、Web サービスがそのデバイス ID の古い URI を置き換えることができます。Windows Phone には、このためのフレームワークはありません。ほとんどの状況では、アプリケーションと Web サービスが互いに通信するための独自プロトコルが既にあるからです。

    Web サービスとの通信に関するベスト プラクティスを次に示します。

    • アプリケーションは、対応する Web サービスに対する認証を受ける必要があります。

    • アプリケーションは、通知チャンネル URI を暗号化してから、対応する Web サービスに URI を送信してください。

    • Web サービスで Windows Phone OS 7.0 に存在しない通知プロパティを使用する場合は (トースト通知の場合は Parameter プロパティ、タイル通知の場合は BackTitleBackBackgroundImageBackContent、タイル ID プロパティ)、Web サービスが正しく Windows Phone OS 7.0 クライアントの通知をダウングレードできるように、OS のバージョンの情報を Web サービスに渡す必要があります。

    • Web サービスは、対応するアプリケーションから受け取った通知チャンネル URI を検証してから、その URI を安全に保管する必要があります。

    • セッションをアプリケーションから開始した場合は、対応する Web サービスに必ず通知チャンネル URI を送信する必要があります。

    • Web サービスから対応するアプリケーションに送信するステータス コードを決めておき、このステータス コードを受け取ったら新しい通知チャンネル URI を作成するようにアプリケーションをプログラミングします。

  • ConnectionStatusChanged イベントに登録します。Microsoft Push Notification Service への接続の状態を監視していれば、通知の機能を低下させるときに他への悪影響を抑えることができます。

  • アプリケーションの設定を変更するという方法で、ユーザーによって通知が無効化された場合は (「アプリケーション ポリシー」のセクション 2.9 参照)、必ず Close()()()() メソッドを使用してプッシュ チャネルを閉じてください。

  • 例外が発生した場合の処理を必ず用意してください。可能性のある例外の一覧については、次の表を参照してください。

以下のエラーは、HttpNotificationChannel オブジェクトの ErrorOccurred イベント ハンドラー コールバック経由で返されます。

エラー

説明

PushErrorTypeChannelOpenFailed

チャンネルは存在しませんが、開くことはできません。チャンネルをもう一度開いてみてください。

PushErrorTypeMessageBadContent

タイル通知ペイロードでリモート URL が指定されましたが、次の条件のいずれかに該当しています。1) http:// ではない、2) ホスト名が 256 文字を超えている、3) URL が 2055 文字を超えている、4) 指定されたドメインは許可されたドメイン コレクションに属していない。

PushErrorTypeNotificationRateTooHigh

現在、単位時間あたりの着信通知の数が多すぎます。メッセージの破棄を避けるために、着信通知の速度を低くしてください。

PushErrorTypePayloadFormatInvalid

XML ペイロードに格納されている XML が無効か、形式が正しくありません。または、ヘッダーに指定されている通知の種類と使用されているペイロードの種類とが一致しません。チャネルは閉じられました。XML ペイロードにエラーがないことを確認し、チャネルを再度開いて新しい URI を取得してください。

PushErrorTypePowerLevelChanged

このエラーは使用されなくなりました。現在では、プッシュ クライアントが電源の状態に基づいて何らかの処理を実行することはないからです。

PushErrorTypeUnknown

内部エラーが発生しましたが、回復できませんでした。デバイスの再起動が必要である可能性があります。

次のエラーが発生すると、HttpNotificationChannel オブジェクトの API 呼び出しに対して InvalidOperationException が返されることがあります。

エラー

説明

PushNotificationTileUriBindFailed

許可されているドメイン コレクションの中でリモート URL が指定されていますが、次のいずれかに該当しています。1) http:// ではない、2) ホスト名が 256 文字を超えている、3) URL が 2055 文字を超えている。

PushNotificationChannelBindFailed

BindToShellTile または BindToShellToast が異常終了しました。もう一度バインドしてください。

PushNotificationChannelBindingExists

BindToShellTile または BindToShellToast が異常終了しました。既にチャネルにバインドされているためです。再度バインドする前に、プロパティ IsShellToastBound または IsShellTileBound を確認するか、UnbindToShellToast または UnbindToShellTile を実行してください。

PushNotificationChannelExists

チャネルは既に開いているため、開く処理に失敗しました。開いているチャネルを見つけるには、Find メソッドを呼び出してください。

PushNotificationChannelNotOpened

チャネルはまだ開いていません。この操作を試みる前に、チャネルを開く必要があります。

PushNotificationChannelOpenFailed

チャンネルは存在しませんが、開くことはできません。チャンネルをもう一度開いてみてください。

PushNotificationChannelQuotaExceeded

このデバイスで既に開いているチャネルの数が上限に達しています。新しいチャネルを開くには、既存のチャネルの 1 つを削除する必要があります。

PushNotificationChannelServerUnavailable

プッシュ クライアント サービスは一時的に利用できない状態になっています。後で操作をやり直してください。

ShellInvalidInterval

指定された間隔は許可されていません。許可されている間隔については、ドキュメントを参照してください。

ShellInvalidRemoteImageUri

指定されたリモート イメージ URI は無効です。JPG または PNG ファイルへの、整形式の HTTP URI のみが許可されます。HTTPS や、その他の種類の URI は使用できません。

ShellInvalidUri

指定されたローカル イメージ URI は無効です。JPG または PNG ファイルへの、整形式のローカル URI のみが許可されます。

表示: