JavaPNS错误处理 - 文档中的矛盾?

时间:2012-12-07 20:51:35

标签: java push-notification apple-push-notifications

在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

1 个答案:

答案 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.

你的整个问题看起来很迂回。简单来说,你的推动失败了。异常和失败之间的区别真的重要吗?无论哪种方式都是不可恢复的,您需要检查日志以确切了解发生了什么。