5

更新: プロットが濃くなります。チャネル名を変更したところ、突然動作するようになりました (つまり、Microsoft プッシュ通知サーバーから同じ H​​TTP 応答を取得しているため、プッシュ サービスに問題はありませんでした)。

しかし、私にとって、これは解決策ではありません。これをテストして、プッシュ通知が機能していないときに同じ応答を受け取っている場合、ユーザーがプッシュ通知を受け取っていることを知るにはどうすればよいですか?

[元の投稿]

Windows Phone 7 デバイスにプッシュ通知を送信しようとしていますが、答えが見つからない非常に大きな問題があります。C# コードから始めます。

次の C# コードを使用してプッシュ通知をセットアップします。

private HttpNotificationChannel channel;
private static string PUSH_CHANNEL = "MySpecialPushChannel";
private Uri PushUri = null;
private bool IsPushRegistered = false;

public void StartPushSubscription()
{
    try
    {
        channel = HttpNotificationChannel.Find(PUSH_CHANNEL);
    }
    catch
    {}

    if (channel != null)
    {            
        PushUri = channel.ChannelUri;
        if (!channel.IsShellTileBound)
            channel.BindToShellTile();
    }
    else
    {
        channel = new HttpNotificationChannel(PUSH_CHANNEL);
        channel.ChannelUriUpdated += new EventHandler<NotificationChannelUriEventArgs>(channel_ChannelUriUpdated);
        channel.HttpNotificationReceived += new EventHandler<HttpNotificationEventArgs>(channel_HttpNotificationReceived);
        channel.ErrorOccurred += new EventHandler<NotificationChannelErrorEventArgs>(channel_ErrorOccurred);

        try
        {
            channel.Open();
            channel.BindToShellTile();
        }
        catch (Exception err)
        {
            channel = null;
            IsPushRegistered = false;
            // Code to try again
        }
    }
}

void channel_ChannelUriUpdated(object sender, NotificationChannelUriEventArgs e)
{
    PushUri = e.ChannelUri;
    IsPushRegistered = true;
}

私は標準の WP7 プッシュ構造に従っています:

  1. HttpNotificationChannel を見つけます (または新しいものを開始します)。
  2. プッシュ通知の URI を取得するイベント ハンドラを登録する
  3. チャンネルを開く
  4. タイルにバインド
  5. チャネル Uri を処理します (プッシュ通知を送信する幸せな日を待つためにサービスに送信します)。

わかりました...これまでのところとても良いです。エラーはありません。Uri を取得し、サービスに問題なく送信します。アプリをスタート画面にピン留めすると、サービスが Uri にプッシュ リクエストを送信します (右上隅にプッシュ カウント数が少し表示されるように、カウントだけを送信します)。次のように HTTP 200 ステータスを返します。

DeviceConnectionStatus => 接続済み

NotificationStatus => 受信済み

SubscriptionStatus => アクティブ

そして... 何もありません。アプリにプッシュ ステータスが表示されません。デバイス、エミュレーター、別のデバイス、複数のサーバーで試してみましたが、結果は常に同じです。機能しないという事実を除いて、すべてが機能しているように見えます。

4

2 に答える 2

3

しかし、私にとって、これは解決策ではありません。これをテストして、プッシュ通知が機能していないときに同じ応答を受け取っている場合、ユーザーがプッシュ通知を受け取っていることを知るにはどうすればよいですか?

答えは、できません。これは、WP7 が通知を処理する方法の制限です。

Tile や Toast などの構造化された通知の場合、Connected/Active/Received/200 応答を受け取った場合、MPNS が通知要求を受け入れたことを知ることができます。ただし、これは有効な XML ペイロードを送信したことを意味するものではありません。

XML の解析を処理するコンポーネントはプッシュ クライアントです。このプロセスは電話で実行され、プッシュ通知を受け取って適切なアプリケーションに配信し、トーストを表示します。

無効な XML を送信した場合、送信したことを示す兆候はまったくありません。同じプッシュ チャネル URI に通知を再度送信しようとすると、多くても 404 の応答が返されます。特定のアプリケーションの無効な XML ペイロードを取得すると、そのアプリケーションのプッシュ チャネルが閉じられ、手順全体をやり直す必要があるようです。

これは、サーバー チームと一緒にデバッグしているときに、電話に別のライブ タイルを表示させようとしているときに発見しました。私があなたに提供できる唯一のアドバイスは、XML を 4 重にチェックすることです。

アプリケーションがアクティブなときにトースト通知を送受信できるため、無効な XML を持つトースト通知のプッシュ通知チャネルのエラー イベント ハンドラーでエラーが発生します。


Microsoft の誰かがこれを読んでいる場合、プッシュ通知システムで発生する可能性のあるエラー状態に関する詳細なドキュメントを提供してください。タイル通知用のイベント ハンドラーも必要です。少なくとも、アプリがフォアグラウンドにあるときにタイル通知を受信し、通知チャネルのエラー イベントを発生させて、XML ペイロードが無効であることを認識できるようにします。

特に、Web サービスが WCF、.NET、Azure などで構築されていない場合、WP7 でプッシュ通知を操作することは、盲目的にさまようようなものです。

「 」という例外メッセージのドキュメントは、「この例外は、通知チャネルのオープンに失敗したときに発生します。通知チャネルをもう一度開いてみてください。」を読むInvalidOperationException(Failed to open channel)べきではありません。参考

于 2011-08-04T22:03:39.957 に答える
0

各デバイスから URL を取得していますか? デバイスが接続するたびに、各デバイスのプッシュ通知サービスから URL を取得する必要があります。

その場合、各クライアントから URL を取得する方法を見つける必要があります。

それをしてもまだプッシュ通知が届かない場合は、マイクロソフトに連絡して、プッシュ通知と関係があるかどうかを確認します

于 2011-07-23T04:36:47.797 に答える