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
この長くとりとめのない質問に勇敢に立ち向かってくれた人に、前もって感謝します。
-- シュノーケル