我在发送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:ExpirTiempode conexiConnectionTime 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:Expirtiempodeconexiconnectiontimpo 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地址上访问这些端口 块,分配给苹果。
因此,通过系统管理员配置防火墙来解决所有问题,以允许这些连接。我希望它对某人有帮助。