在 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() 可能是错误的,因为返回了合法的错误数据包。我不知道,但我想如果 Apple 由于运营商问题未能发送通知,可能会被退回,例如,这意味着令牌不一定无效。
那么,isSuccess() == false 在发送消息时是一个不可恢复的错误,但不是需要异常的错误,例如密钥库失败或根本无法连接到服务器?
换句话说 - id isSuccessful() == false,我真的应该按照建议从我的数据库中删除设备令牌吗?片段说是的,但在我看来,文档似乎另有建议......
链接:http ://code.google.com/p/javapns/wiki/ManagingPushErrors
提前感谢任何勇敢地提出这个冗长而漫无边际的问题的人。
-- 浮潜