Desarrollamos una aplicación para iPhone, y tenemos notificación de inserción para que el desarrollo y la versión ad hoc funcionen correctamente. Pero cuando tratamos de enviar notificaciones automáticas a los dispositivos de usuario reales en nuestra base de datos, obtuvimos el restablecimiento de la conexión SSL, y luego el error Tubo roto. Creemos que tal vez haya demasiados dispositivos en nuestra base de datos (más de 70000), por lo que no se pueden enviar todos los mensajes al mismo tiempo. Así que tratamos de enviar mensajes a 1000 dispositivos una vez, pero aún recibimos este error de "conexión interrumpida" para alrededor de 100 mensajes. Y no estamos seguros de si los mensajes han sido enviados. ¿Cualquier sugerencia?obtener SSL Error de tubería rota cuando tratamos de hacer una notificación de inserción
Respuesta
Hemos resuelto este problema. Se rompe debido a tokens no válidos en nuestra tabla de base de datos. Y el servicio de Apple apns nos desconectará si hay un token no válido. Dado que la conexión está interrumpida, tendrá un error "Broken Pipe" cuando intente enviar mensajes nuevamente. La solución básica es encontrar si la escritura a la tubería es exitosa, si no, simplemente desconecte y reconecte de nuevo después de un poco de retraso.
Ojalá me hubieras explicado cómo codificaste esto - Mona 14 de junio a las 23:52 – Mona
Suele suceder cuando recorro todos los tokens de dispositivo del usuario y si alguno de ellos falla, rompe el tipo de cadena y muestra el mismo error, todos Lo que podemos hacer es clasificar al usuario con un token de dispositivo reciente y verificar la longitud de nuestro extremo, funcionó después de eso. ¡Gracias su respuesta me ayudó!~ –
emagic es correcto, una razón para el error de "tubería rota" puede ocurrir a partir de tokens no válidos. Hay algunas otras razones por las que puede ocurrir también. El siguiente es de Apple Technical Note TN2265:
El problema más común es un token de dispositivo no válido. Si el token llegó al desde el entorno de la zona de pruebas, como cuando está probando una compilación de desarrollo en la casa, no puede enviarlo al servicio push de producción. Cada entorno de inserción emitirá un token diferente para el mismo dispositivo o computadora . Si envía un token de dispositivo al entorno equivocado , el servicio push lo verá como un token no válido y descartará la notificación.
Un token de dispositivo no válido también puede significar que el usuario ha eliminado su aplicación desde su dispositivo o computadora. Debe verificar el servicio de comentarios al menos una vez al día para los tokens de dispositivos que ya no son válidos.
Otros posibles problemas pueden ser el envío de una carga útil superior a 256 bytes, es posible que su carga útil no tenga el formato correcto o que su diccionario JSON tenga una sintaxis incorrecta.
Una desconexión ocasional mientras su proveedor está inactivo no es nada preocupado por; solo restablezca la conexión y continúe. Si un de los servidores de inserción está inactivo, el mecanismo de equilibrio de carga direccionará de forma transparente su nueva conexión a otro servidor suponiendo que se conecta por nombre de host y no por dirección IP estática.
Extendiéndose sobre la respuesta de emagic, este es mi código php snipplet:
private $fp;
private function connect(){
$apnsHost = 'gateway.push.apple.com';
$apnsCert = 'certs/cert.pem';
$apnsPort = 2195;
$pass = "blah";
$streamContext = stream_context_create();
stream_context_set_option($streamContext, 'ssl', 'local_cert', $apnsCert);
stream_context_set_option($streamContext, 'ssl', 'passphrase', $pass);
$this->fp = stream_socket_client('ssl://' . $apnsHost . ':' . $apnsPort, $err, $errstr, 60, STREAM_CLIENT_CONNECT|STREAM_CLIENT_PERSISTENT, $streamContext);
if (!$this->fp) return("Failed to connect: $err $errstr<br>");
echo 'Connected to APNS<hr />';
}
private function send(){
$this->connect();
foreach($pushes as $push) {
$payload['aps'] = array('alert' => $push->text, 'badge' => 0, 'sound' => 'default');
$payload2 = json_encode($payload);
$msg = chr(0) . pack('n', 32) . pack('H*', $push->token) . pack('n', strlen($payload2)) . $payload2;
try {
$result = fwrite($this->fp, $msg, strlen($msg));
}
catch (\Exception $e) {
fclose($this->fp);
echo('Error sending payload: ' . $e->getMessage());
sleep(5);
$this->connect();
}
}
}
Estoy tratando de usar esto, pero el try/catch no parece activarse, incluso cuando fwrite() falla. Recibo mensajes de la consola que dicen que no se pudo escribir, pero nunca recibo el mensaje "Error al enviar la carga útil" para enviar. ¿Estás seguro de que fwrite() arroja excepciones? – othomas
Intente eliminar la excepción principal \ from \ ... – JoeGalind
Probé eso, no hace la diferencia. El bloque catch nunca se llama. – othomas
- 1. Python: subprocess.call tubería rota
- 2. ¿Cómo hacer que la producción de tubería desde un script Ruby a 'cabeza' sin conseguir una tubería rota de error
- 3. Notificación de inserción en PHP
- 4. 1 Certificado SSL de notificación de inserción para múltiples aplicaciones
- 5. putpkt: escritura fallida, tubería rota
- 6. Error de mapeo de servlet de Tomcat después de error de tubería rota
- 7. Frasco tubería rota con las peticiones
- 8. La notificación de inserción de iOS no funciona cuando se utiliza el programador de crontab
- 9. ¿Cómo manejar una tubería rota (SIGPIPE) en python?
- 10. Pruebas de tubería de activos de rieles pasan producción rota
- 11. Python BaseHTTPServer, ¿cómo atrapo/atrapo errores de "tubería rota"?
- 12. Error de notificación de inserción: "No se puede establecer el archivo de cadena de cert local"
- 13. Insignias de notificación de inserción no vienen
- 14. Obteniendo el error de restricción cuando falla una inserción
- 15. notificación de inserción de Apple con una aplicación empresarial
- 16. posible notificación de inserción maquillaje sin APN
- 17. Notificación de inserción para aplicaciones de Android
- 18. Enviar notificación de inserción de fichas para muchos dispositivos
- 19. Mensaje de notificación de inserción de iOS: acción después de hacer clic en el botón VER
- 20. hacer una imagen rota respeto dimensiones CSS
- 21. Cómo hacer una notificación de inserción del servidor al móvil de Android
- 22. vibrar en la notificación de inserción
- 23. Recuperar datos de notificación de notificación
- 24. iPhone notificación de inserción Urban Airship
- 25. Error de Postgres SSL
- 26. Notificación de inserción de nube de Appcelerator en iOS
- 27. ¿Límites en los sonidos de notificación de inserción de iPhone?
- 28. Sonido de notificación de inserción de iOS personalizado
- 29. ¿Cómo puedo volver a conectar un enchufe después de una tubería rota?
- 30. Cómo probar la notificación de inserción funciona en mi aplicación
Estamos teniendo el mismo problema; sin embargo, con 100.000 usuarios. Por lo que sabemos, la notificación llegará a los primeros 100 o así sucesivamente, pero no después de eso. Solo puedo suponer que hay un límite (por recuento o por tiempo) en las notificaciones que se envían. ¿Realmente podría hacer con alguien para confirmar esto? – Wex