发送批量iOS通知的问题



我在发送iOS设备的批量通知时遇到问题,当我发送几个设备(或多或少1-20个(时,它可以无问题,但是当我必须发送一个设备时批量发送(3000 (它给我以下错误:

[2017-04-27 15:12:07]错误(Notificaciones:347( - ios:错误en Envio NOTIFICACIONES-通信Exception: javapns.communication.exceptions.communication exception:通信 例外:java.net.connectException:Expir󠥬Tiempode conexi󮠨ConnectionTime of Out( javapns.communication.connectiontoappleserver.getsslsocket(ConnectionToToAppleser.java:156( 在 javapns.notification.pushnotificationmanager.initializeconnection(pushnotificationmanager.java:106( 在 javapns.notification.transmission.notificationthread.runlist(notificationthread.java:215( 在 javapns.notification.transmission.notificationthread.run(notificationthread.java:199( 在java.lang.thread.run(thread.java:745(上引起的 java.net.connectException:Expir󠥬tiempodeconexi󮠨connectiontimpo out(at Java.net.plainsocketimpl.socketConnect(本机方法(at java.net.abstractplainsocketimpl.doconnect(AbstractPlainSocketImpl.java:339( 在 java.net.abstractplainsocketimpl.connectToAddress(AbstractPlainSocketImpl.java:200( 在 java.net.abstractplainsocketimpl.connect(AbstractPlainSocketImpl.java:182( 在java.net.sockssocketimpl.connect(sockssocketimpl.java:392(at java.net.socket.connect(socket.java:576(at sun.security.ssl.sslsocketimpl.connect(sslsocketimpl.java:635(at sun.security.ssl.sslsocketimpl。(sslsocketimpl.java:423(at sun.security.ssl.sslsocketfactoryimpl.createsocket(sslsocketfactoryimpl.java:88( 在 javapns.communication.connectiontoappleserver.getsslsocket(ConnectionToAppleServer.java:153( ... 4更多

我的代码如下:

private static  void realizaEnvioIOSLista (final List<DispositivoDto> dispositivos, final String textoES, final String textoCA, final String textoEN, final String tipoNotificacion){       
        Thread thread = new Thread(){
            public void run(){              
                try {           
                    final List<String> idsDispositivos = new ArrayList<String>();                   
                    final String keystore = XmlUtils.dirCertIOS + XmlUtils.nomCertificado;
                    final String password = XmlUtils.password;
                    final boolean production = XmlUtils.production;
                    //Obtenemos los ids de los dispositivos
                    for(DispositivoDto r : dispositivos)
                         idsDispositivos.add(r.getIdDispositivo());                  
                    PushNotificationPayload payload = PushNotificationBigPayload.complex();
                    /* Customize the payload */ 
                    payload.addAlert(textoES);    
//                  payload.addSound('default');
                    payload.setContentAvailable(true);
                    payload.addCustomDictionary("es", textoES);
                    payload.addCustomDictionary("en", textoCA);
                    payload.addCustomDictionary("ca", textoEN);
                    payload.addCustomDictionary("tiponotificacion", tipoNotificacion);  
                    List<PushedNotification> notifications = new ArrayList<PushedNotification>();
                    if(idsDispositivos.size()<= 200){   
                        notifications = Push.payload(payload, keystore, password, production, idsDispositivos);
                    } else {
                        int threads = 1;
                        if(dispositivos.size() > 200) {
                            threads = (int) Math.ceil(dispositivos.size()/200);
                        }
                        notifications = Push.payload(payload, keystore, password, production, threads, idsDispositivos);  
                    }
                    int dispEliminados = 0;
                    int dispNotificados = 0;
                    for (PushedNotification notification : notifications) {
                        if (notification.isSuccessful()) {
                            dispNotificados ++;
                        } else {
                            String invalidToken = notification.getDevice().getToken();
                            int index = idsDispositivos.indexOf(invalidToken);
                            Integer usuario = dispositivos.get(index).getUsuario();
                            String idHardware = dispositivos.get(index).getIdHardwareDis();
                            aBD.unregisterDispositivo(usuario, invalidToken,idHardware);
                            dispEliminados ++;
        //                  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){
                                logNot.info("IOS: " +theErrorResponse.getMessage());
                            }
                        }
                    }   
                    logNot.info("IOS: Dispositivos Notificados correctamente: " + dispNotificados);
                    logNot.info("IOS: Dispositivos Eliminados: " +dispEliminados);
                } catch (CommunicationException e) {
                    logNot.error("IOS: Error en envio notificaciones - CommunicationException: ",e);
                } catch (KeystoreException e) {
                    logNot.error("IOS: Error en envio notificaciones - KeystoreException: ",e);
                } catch (JSONException e) {
                    logNot.error("IOS: Error en envio notificaciones - JSONException: ",e);
                } catch (Exception e) {
                    logNot.error("IOS: Error en envio notificaciones",e);
                }
            }
        };
        thread.start();
    }

有问题吗?可以制作到Apple服务器的最大设备和连接数量是多少?欢迎任何帮助。

我找到了解决问题的解决方案,代码可以正常工作,在与系统管理员交谈后,我们可以看到这是服务器配置的问题,因为根据此链接苹果要发送通知,必须考虑以下内容:

使用Apple Push Notification Service(APN(,您的Mac和iOS 客户需要与苹果服务器的直接连接。

这样:

如果您在防火墙后面使用Wi-Fi,或者使用私人访问点名称 蜂窝数据,连接到特定端口。您需要直接的,无形的 连接到这些端口上的APNS服务器:

  • TCP端口5223与APNS通信。
  • TCP端口2195向APN发送通知。
  • TCP端口2196用于APNS反馈服务。
  • TCP端口443在设备激活期间需要进行,然后进行后备(仅在Wi-Fi上(,如果设备无法在端口5223上访问APN。

此外:

APNS服务器使用负载平衡,因此您的设备并不总是 连接到同一公共IP地址以进行通知。最好 让您的设备在整个17.0.0.0/8地址上访问这些端口 块,分配给苹果。

因此,通过系统管理员配置防火墙来解决所有问题,以允许这些连接。我希望它对某人有帮助。

相关内容

  • 没有找到相关文章

最新更新