无法向 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 生产无法正常工作