在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
提前感谢那些冒着这个漫长而漫无边际的问题的人。
- Snorkel
答案 0 :(得分:0)
文档说你是对的。从技术上讲,它意味着推送失败,但并不是因为异常导致失败。由于合法的失败,它可能会失败。 (我在成功连接时定义了合法的失败,消息没有明显的缺陷,但是服务器拒绝接受它。)关键行如下:
IE To 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.
你的整个问题看起来很迂回。简单来说,你的推动失败了。异常和失败之间的区别真的重要吗?无论哪种方式都是不可恢复的,您需要检查日志以确切了解发生了什么。