0

JavaPNS ドキュメントでは、次のように表示されます。

プッシュが Apple に正常に送信されたかどうか、および Apple がエラー応答パケットを返さなかったかどうかを確認するには、単に PushNotification.isSuccessful() メソッドを呼び出します。次のいずれかの条件が発生した場合、通知が成功しない可能性があります

  • ライブラリは、明らかな仕様違反のため、提供されたトークンを拒否しました (例: トークンの長さが 64 バイトでないなど)。
  • 明らかな仕様違反 (例: ペイロードが大きすぎるなど) が原因で、ライブラリが提供したペイロードを拒否しました。
  • 接続エラーが発生し、ライブラリが Apple サーバーと通信できませんでした
  • 証明書またはキーストアでエラーが発生しました (例: 間違ったパスワード、無効なキーストア形式など)。
  • Apple サーバーから有効なエラー応答パケットを受信しました

および他の多くの考えられるエラー...

しかし、提供されたコードスニペットはそうします

for (PushedNotification notification : notifications) {
    if (notification.isSuccessful()) {
        /* Apple accepted the notification and should deliver it */  
        System.out.println("Push notification sent successfully to: " + notification.getDevice().getToken());
    /* Still need to query the Feedback Service regularly */  
    } else {
        String invalidToken = notification.getDevice().getToken();
        /* Add code here to remove invalidToken from your database */  

        /* Find out more about what the problem was */  
        Exception theProblem = notification.getException();
        theProblem.printStackTrace();

        /* If the problem was an error-response packet returned by Apple, get it */  
        ResponsePacket theErrorResponse = notification.getResponse();
        if (theErrorResponse != null) {
            System.out.println(theErrorResponse.getMessage());
        }
     }
 }

isSuccess() == false は回復不能なエラーを意味し、デバイス トークンが無効であることを暗示しているようです。

ただし、考えられる理由のリストには、正当なエラー パケットが返されたために isSUCcess() が false である可能性があることが示されていました。わかりませんが、Apple がキャリアの問題などで通知を送信できなかった場合、トークンが返される可能性があると思います。これは、トークンが必ずしも無効ではないことを意味します。

これを読む正しい方法は、 isSuccess() == false はメッセージ送信時の回復不能なエラーですが、キーストアの失敗やサーバーへの接続不能などの例外を必要とするものではないということですか?

つまり、id isSuccessful() == false です。提案されているように、DB からデバイス トークンを本当に削除する必要がありますか? スニペットには「はい」と書かれていますが、ドキュメントではそうではないように思われます...

リンク: http://code.google.com/p/javapns/wiki/ManagingPushErrors

この長くとりとめのない質問に勇敢に立ち向かってくれた人に、前もって感謝します。

-- シュノーケル

4

1 に答える 1

0

ドキュメントには、あなたが正しいと書かれています。技術的には、プッシュが失敗したことを意味しますが、例外が原因で失敗したわけではありません。正当な障害のために失敗した可能性があります。(接続に成功したため、正当な失敗を定義します。メッセージに明らかな欠陥はありませんでしたが、サーバーはそれを受け入れることを拒否しました。) 重要な行は次のとおりです。

IETo find out if a push was successfully sent to Apple and that Apple did not return any error-response packet, simply invoke the pushedNotification.isSuccessful() method.

あなたの質問全体はかなり回りくどいようです。簡単に言えば、あなたのプッシュは失敗しました。例外と失敗の区別は本当に重要ですか? いずれにせよ、回復不能であり、ログをチェックして何が起こったのかを正確に確認する必要があります。

于 2012-12-07T20:57:48.177 に答える