情報
要求されたトピックは次のとおりです。しかし、このトピックはこのライブラリには含まれていません。

Windows Phone 8 でプッシュ通知を受信するためのアプリの設定

2014/06/18

対象: Windows Phone 8 および Windows Phone Silverlight 8.1 | Windows Phone OS 7.1

Microsoft Push Notification Service を使用するには、Microsoft Push Notification Service からプッシュ通知を受信するように Windows Phone アプリを設定する必要があります。Windows Phone の Microsoft Push Notification Service は、サードパーティの開発者に、クラウド サービスから Windows Phone アプリに効率的にデータを送信するチャネルを提供する、非同期の最適なサービスです。プッシュ通知の受信を実装するサンプル コードについては、「Windows Phone 8 用のトースト通知を送受信する方法」、「Windows Phone 8 用のタイル通知を送受信する方法」、「Windows Phone 8 用の Raw 通知を送受信する方法」を参照してください。

プッシュ通知を受信するには、Windows Phone クライアント アプリが以下に対応する必要があります。

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

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

  • Raw 通知を使用する場合は、アプリが実行されていないと、プッシュ チャネルは削除されます。VoIP アプリのようにプッシュ チャネルを保持する必要があるアプリは、BindToShellTile() または BindToShellToast() を呼び出すことによって、プッシュ チャネルを ShellTile または ShellToast にバインドする必要があります。VoIP アプリの作成の詳細については、「Windows Phone 8 用の VoIP アプリ」を参照してください。

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

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

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

    発生したエラーを処理するため、すべてのアプリを ErrorOccurred イベントに登録する必要があります。

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

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

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

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

    • アプリは、対応するクラウド サービスに対する認証を受ける必要があります。

    • アプリは、通知チャネル URI を暗号化してから、対応するクラウド サービスに URI を送信する必要があります。

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

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

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

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

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

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

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

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

エラー

説明

PushErrorTypeChannelOpenFailed

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

PushErrorTypeMessageBadContent

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

トースト通知ペイロード内の <Param> タグの値が 256 文字の制限を超えています。

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 プロパティ、または UnbindToShellToastUnbindToShellTile を確認してから、バインドをやり直してください。

PushNotificationChannelExists

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

PushNotificationChannelNotOpened

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

PushNotificationChannelOpenFailed

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

PushNotificationChannelQuotaExceeded

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

PushNotificationChannelServerUnavailable

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

ShellInvalidInterval

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

ShellInvalidRemoteImageUri

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

ShellInvalidUri

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

注意注意:

この機能を有効にする API は、Windows Phone 8 Update 3 (OS バージョン番号 8.0.10492) 以降がインストールされたデバイスでのみ使用できます。デバイスの OS バージョンを確認してから、この機能を使用してください。

ユーザーが電話でバッテリー セーバー機能を有効にした場合、バッテリー残量が最小電力のしきい値を下回り、バッテリー セーバーがアクティブになると、電力を節約するためにプッシュ通知の受信は無効になります。アプリがプッシュ通知を多用している場合は、バッテリー セーバーが有効な場合を検出し、バッテリー セーバーがアクティブなときはプッシュ通知が送信されないことをユーザーに警告することをお勧めします。

バッテリー セーバーが有効な場合を検出するには、PowerManager.PowerSavingModeEnabled プロパティをオンにする必要があります。このプロパティは、Windows Phone 8 Update 3 を実行するデバイスにのみ使用できるので、デバイスの OS バージョンを確認してから、リフレクションを介してこのプロパティにアクセスする必要があります。次の例は、バッテリー セーバーが現在有効かどうかを検出する方法を示しています。


using Windows.Phone.System.Power;

public void CheckBatterySaverState()
{
    // The minimum phone version that supports the PowerSavingModeEnabled property
    Version TargetVersion = new Version(8, 0, 10492);

    if (Environment.OSVersion.Version >= TargetVersion) 
    {
        // Use reflection to get the PowerSavingModeEnabled value
        bool powerSaveOn = (bool)
            typeof(PowerManager).GetProperty("PowerSavingModeEnabled").GetValue(null, null);

        if (powerSaveOn)
        {
            MessageBox.Show("Battery Saver enabled. This app won’t receive notifications when Battery Saver is active.");
        }
    }
}

表示: