php ios apple-push-notifications push apns-php

APNS+PHP "stream_socket_client(): no se pudo habilitar crypto"



ios apple-push-notifications (7)

Estoy teniendo problemas para usar APNS con PHP y recibir el siguiente mensaje:

stream_socket_client(): Failed to enable crypto

El problema solo ocurre a veces, y otras veces en realidad enviaría el impulso.

Como tengo el script de prueba en un bucle de 10 iteraciones, a veces obtendría esto:

stream_socket_client(): SSL: Connection reset by peer

Estoy probando usando el servidor de sandbox tls://gateway.sandbox.push.apple.com:2195

Esto es lo que intenté:

  • Intenté volver a emitir el PEM y todos los certificados con él.
  • sslv3:// con el protocolo de solicitud sslv3:// y tls:// .
  • Jugué con la frase de contraseña (empuje trabajado sin la frase de contraseña por cierto)
  • Intenté buscar una solución en Stackoverflow y nada funcionó.
  • Permisos de archivos pem comprobados 644
  • Comprobado los permisos de los directorios padre pem 755

Parece que todas las soluciones que encontré en Google y SO son personas que tienen problemas para presionar.

Siento que el servicio es de tarifa limitada tal vez? Debido a que esperamos un tiempo (alrededor de 15 minutos) y luego lo intentamos de nuevo, pudimos enviar alrededor de 100 mensajes hasta que empecé a recibir ese mensaje nuevamente.


El servicio de empuje de la caja de arena tiene una tasa limitada. Lo experimenté yo mismo durante las pruebas, pero nunca he encontrado ningún límite de este tipo utilizando la API de producción.

También podría estar golpeando sus otras protecciones.

¿Está abriendo una conexión, enviando un mensaje, cerrando la conexión y luego haciendo un bucle y haciendo todo de nuevo?

Eso hará que se te caigan las notificaciones. Apple quiere que envíes varias notificaciones push usando la misma conexión, no una nueva cada vez.

Mejores prácticas para gestionar conexiones

Puede establecer varias conexiones con la misma puerta de enlace o con varias instancias de puerta de enlace. Si necesita enviar una gran cantidad de notificaciones remotas, distribúyalas a través de conexiones a varias puertas de enlace diferentes. Esto mejora el rendimiento en comparación con el uso de una sola conexión: le permite enviar las notificaciones remotas más rápido y permite que los APN las entreguen más rápido.

Mantenga sus conexiones con APN abiertas a través de múltiples notificaciones; no abra y cierre repetidamente las conexiones. Los APN tratan la conexión rápida y la desconexión como un ataque de denegación de servicio. Debe dejar una conexión abierta a menos que sepa que estará inactiva durante un período prolongado de tiempo, por ejemplo, si solo envía notificaciones a sus usuarios una vez al día, está bien usar una nueva conexión cada día.

De Apple Docs @ https://developer.apple.com/library/ios/documentation/NetworkingInternet/Conceptual/RemoteNotificationsPG/Chapters/CommunicatingWIthAPS.html


En mi caso, el problema fue con mi mac (OSX Sierra). Subí php y cert a mi servidor, lo ejecuté y me entregaron la notificación.


Mi código PHP estaba generando el siguiente error:

PHP Warning: stream_socket_client(): Failed to enable crypto in /private/tmp/t.php on line 12 PHP Warning: stream_socket_client(): unable to connect to ssl://gateway.sandbox.push.apple.com:2195 (Unknown error) in /private/tmp/t.php on line 12 PHP Warning: fclose() expects parameter 1 to be resource, boolean given in /private/tmp/t.php on line 24

¡El problema era que el maldito certificado expiraba anteayer! :-) ¿Puedes creer esto?

Por lo tanto, necesito recrear mi archivo PEM.


No es necesario recrear tu archivo pem.

ese error ocurre cuando usas una contraseña incorrecta

saludos emiliano


Tengo este problema porque me olvidé tontamente de incluir la extensión de archivo (.pem) al proporcionar la ruta del archivo para local_cert.


Tuve este problema Desapareció después de dar permiso de escritura para "todos" para el archivo .pem.


algunos cheques

  1. El token del dispositivo debe ser: sin spaces y sin < o >
  2. asegúrese de que la ruta del certificado es correcta y caducada.
  3. Asegúrese de que la frase de contraseña que está utilizando sea la que usó para hacer el certificado