无法向 iOs 设备发送通知

Posted

技术标签:

【中文标题】无法向 iOs 设备发送通知【英文标题】:Failed to send notifications to iOs devices 【发布时间】:2017-04-12 09:30:46 【问题描述】:

我正在实现来自 .jar 的通知,android 中的通知运行良好,但最近ios 中的通知给了我一个 错误,如下所示:

传送错误: javapns.notification.exceptions.PayloadMaxSizeExceededException: 总有效负载大小超过允许的限制(有效负载为 259 字节,限制 是 256)

我使用的代码如下:

    //El metodo de multithread payload hace return unicamente cuando todos los hilos han finalizado de poner las notificaciones.
    //Como no queremos esperar a que termine ponemos el codigo en un hilo separado para que pueda continuar y no se quede colgado el WS.            
    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());                  

                // Creamos el payload con los campos que necesitemos       
                PushNotificationPayload payload = PushNotificationPayload.complex();    

                /* Customize the payload */ 
                payload.addAlert(textoES);   
                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)
                    /* Push your custom payload */    
                    notifications = Push.payload(payload, keystore, password, production, idsDispositivos);

                // Si hay mas de 200 dispositivos creamos diferentes hilos utilizando el multithread payload
                 else 
                    // Decidimos cuantos hilos vamos a crear y usar
                    int threads = 30;

                    if(dispositivos.size() > 200) 
                        threads = (int) Math.ceil(dispositivos.size()/200);
                    else
                        threads = 1;
                    

                    // empezamos los hilos, esperamos a que terminen, y se coge la lista de notificaciones
                    notifications = Push.payload(payload, keystore, password, production, threads, idsDispositivos);
                

                //Gestion de los resultados del envio de notificaciones 
                int dispEliminados = 0;
                int dispNotificados = 0;

                for (PushedNotification notification : notifications) 
                    if (notification.isSuccessful()) 
                        dispNotificados ++;
                        // Apple accepta la notificacion y debe enviarla
                     else 
                        String invalidToken = notification.getDevice().getToken();

                        //obtenemos el indice del dispositivo en la lista de dispositivos
                        int index = idsDispositivos.indexOf(invalidToken);

                        //obtenemos la informacion del dispositivo a borrar
                        Integer usuario = dispositivos.get(index).getUsuario();
                        String idHardware = dispositivos.get(index).getIdHardwareDis();

                        //quitamos el dispositivo de nuestra BD
                        aBD.unregisterDispositivo(usuario, invalidToken,idHardware);
                        dispEliminados ++;                          

                        //Encontramos mas informacion sobre el problema ocurrido
    //                  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());
                        
                    
                
             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();

有什么想法吗?

【问题讨论】:

它可以帮助你***.com/questions/26233730/… developer.apple.com/library/content/documentation/… 感谢@AravindBhuvanendran!我去看看! 【参考方案1】:

我设法消除了错误:

传送错误: javapns.notification.exceptions.PayloadMaxSizeExceededException: 总有效负载大小超过允许的限制(有效负载为 259 字节,限制 是 256)

为此我不得不修改这一行:

PushNotificationPayload payload = PushNotificationPayload.complex(); 

这个别人:

PushNotificationPayload payload = PushNotificationBigPayload.complex();

【讨论】:

【参考方案2】:

我的猜测是您使用的是已弃用的 Javapns 实现,它使用旧的 APNS 有效负载大小限制。随着您的有效载荷大小增加,您开始面临这个问题。我认为您可以尝试一种 javapns 更新的实现,例如 this。

【讨论】:

我正在使用从 Maven 下载的 javapns 2.3.1 版本

以上是关于无法向 iOs 设备发送通知的主要内容,如果未能解决你的问题,请参考以下文章

通过向 FCM 单个设备发送通知来反应本机 Firebase iOS 生产无法正常工作

使用 php 向 IOS 设备发送推送通知

无法收到ios通知

没有设备令牌的 ios 推送通知/消息

在应用程序被杀死后,使用 HTTP 请求通过 Firebase(FCM)向 iOS 设备发送推送通知 [重复]

FCM 通过 fcm 控制台向我的 ios 设备发送通知,但从 php 服务它没有发送通知