2017-05-03 3 views
1

Ich habe Probleme beim Senden von Massenbenachrichtigungen für iOS-Geräte, wenn ich ein paar Geräte (1-20 mehr oder weniger) aussende, funktioniert es ohne Probleme, aber wenn ich eine Massensendung senden muss (3000+) es gibt mir die folgende Fehlermeldung:Probleme beim Senden von Bulk-iOS-Benachrichtigungen

[2017-04-27 15:12:07] ERROR (Notificaciones:347) - IOS: Error en envio notificaciones - CommunicationException: javapns.communication.exceptions.CommunicationException: Communication exception: java.net.ConnectException: Expir tiempo de conexiConnection timed out) at javapns.communication.ConnectionToAppleServer.getSSLSocket(ConnectionToAppleServer.java:156) at javapns.notification.PushNotificationManager.initializeConnection(PushNotificationManager.java:106) at javapns.notification.transmission.NotificationThread.runList(NotificationThread.java:215) at javapns.notification.transmission.NotificationThread.run(NotificationThread.java:199) at java.lang.Thread.run(Thread.java:745) Caused by: java.net.ConnectException: Expir tiempo de conexiConnection timed out) at java.net.PlainSocketImpl.socketConnect(Native Method) at java.net.AbstractPlainSocketImpl.doConnect(AbstractPlainSocketImpl.java:339) at java.net.AbstractPlainSocketImpl.connectToAddress(AbstractPlainSocketImpl.java:200) at java.net.AbstractPlainSocketImpl.connect(AbstractPlainSocketImpl.java:182) at 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) at javapns.communication.ConnectionToAppleServer.getSSLSocket(ConnectionToAppleServer.java:153) ... 4 more

Mein Code ist folgende:

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(); 
    } 

etwas falsch gemacht? Wie viele Geräte und Verbindungen können maximal zum Apple-Server hergestellt werden? Jede Hilfe ist willkommen.

Antwort

0

Ich fand die Lösung für mein Problem, der Code funktioniert gut, nach dem Gespräch mit den Systemadministratoren konnten wir sehen, dass es ein Problem der Konfiguration der Server war, da nach diesem Link von apple gesendet werden kann

To use Apple Push Notification service (APNs), your Mac and iOS clients need a direct and persistent connection to Apple's servers.

Damit:

If you use Wi-Fi behind a firewall, or private Access Point Name for cellular data, connect to specific ports. You need a direct, unproxied connection to the APNs servers on these ports:

  • TCP port 5223 to communicate with APNs.
  • TCP port 2195 to send notifications to APNs.
  • TCP port 2196 for the APNs feedback service.
  • TCP port 443 is required during device activation, and afterwards for fallback (on Wi-Fi only) if devices can't reach APNs on port 5223.

Außerdem:

Benachrichtigungen, muss folgendes berücksichtigt werden

Alles wurde gelöst, indem die Firewall von den Systemadministratoren so konfiguriert wurde, dass diese Verbindungen zugelassen wurden. Ich hoffe es hilft jemandem.

Verwandte Themen