www válido solucionar solucion sitio servidor seguridad problema presentado pero intentado has error err_bad_ssl_client_auth_cert confianza como certificado adm acceder iphone apple-push-notifications

iphone - válido - error de certificado windows 10



Obtener SSL Error de tubería rota al intentar hacer una notificación de inserción (3)

Desarrollamos una aplicación para iPhone y tenemos notificaciones push para el desarrollo y la versión ad hoc que funcionan correctamente. Pero cuando intentamos enviar notificaciones automáticas a dispositivos de usuarios reales en nuestra base de datos, se restablece la conexión SSL y, a continuación, se produce un error de tubería rota. Creemos que quizás hay 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 intentamos enviar mensajes a 1000 dispositivos una vez, pero seguimos recibiendo este error de "tubería rota" para aproximadamente 100 mensajes. Y no estamos seguros de si los mensajes han sido enviados. ¿Cualquier sugerencia?


Extendiéndome en 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(); } } }


Hemos resuelto este problema. Está roto debido a tokens no válidos en nuestra tabla de base de datos. Y el servicio Apple Apns nos desconectará si hay un token no válido. Dado que la conexión está interrumpida, aparecerá el error "Broken Pipe" cuando intente enviar mensajes nuevamente. La solución básica es averiguar si la escritura en la tubería es exitosa, si no, simplemente desconecte y vuelva a conectarse después de un cierto retraso.


emagic es correcto, una razón para el error "pipe roto" puede ocurrir desde tokens no válidos. Hay algunas otras razones por las que puede ocurrir también. Lo siguiente es de la nota técnica TN2265 de Apple :

El problema más común es un token de dispositivo no válido. Si el token proviene del entorno de sandbox, como cuando está probando un desarrollo de desarrollo interno, no puede enviarlo al servicio de empuje 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 incorrecto, el servicio de inserción 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 de su dispositivo o computadora. Debería consultar el servicio de comentarios al menos una vez al día para detectar tokens de dispositivos que ya no son válidos.

Otros posibles problemas pueden ser el envío de una carga útil de más de 256 bytes, su carga útil puede no tener el formato correcto o quizás su diccionario JSON tenga una sintaxis incorrecta.

Una desconexión ocasional mientras su proveedor está inactivo no es nada de qué preocuparse; Solo restablece la conexión y continúa. Si uno de los servidores de inserción está inactivo, el mecanismo de equilibrio de carga dirigirá de forma transparente su nueva conexión a otro servidor, suponiendo que se conecte por nombre de host y no por dirección IP estática.