ApnsPHP: notifications push trabajando en desarrollo pero no en producción

Sí: hay muchos duplicates a esta pregunta, pero ninguna de las respuestas ayudó.

Estoy siguiendo este gran tutorial de Ali Hafizji sobre el uso del service APNS para las notifications push .

Prueba de APNS en modo de desarrollo :

  • download aps_development.cer
  • exportar la key privada para el certificate ( aps_development_key.p12 )

Luego combiné los dos usando los siguientes commands (usando el terminal):

 openssl x509 -in aps_development.cer -inform der -out aps_development.pem openssl pkcs12 -nocerts -out aps_development_key.pem -in aps_development.p12 cat aps_development.pem aps_development_key.pem > final_aps_development.pem 

Y (usando ApnsPHP en el server) podría enviar correctamente una notificación push con esta configuration:

 ... $push = new ApnsPHP_Push(ApnsPHP_Abstract::ENVIRONMENT_SANDBOX,'final_aps_development.pem'); $push->setRootCertificationAuthority('entrust_root_certification_authority.pem'); $push->setProviderCertificatePassphrase('mypassword'); ... 

Un sidenote: tomé el entrust_root_certification_authority.pem desde https://github.com/jonathanrcarter/push2press , la dirección correcta para search sería probablemente https://www.entrust.net/downloads/binary/entrust_2048_ca.cer ( de todos modos son lo mismo).

En este caso, la aplicación se estaba ejecutando en modo de debugging (en el dispositivo, se ejecuta desde XCode) y todo funcionaba bien.

Prueba de APNS en modo de producción :

Para probar el APNS en el modo de producción, archivé la aplicación para la distribución de AdHoc y la instalé en el dispositivo con la Utilidad de configuration de iPhone .

Seguí el mismo procedimiento con aps_production.cer para hacer final_aps_production.pem .

Bang, el script php que se llama para enviar notifications automáticas devolvió Código de estado HTML 500.

La generación $push se modificó por supuesto para el modo de producción:

 ... $push = new ApnsPHP_Push(ApnsPHP_Abstract::ENVIRONMENT_PRODUCTION,'final_aps_production.pem'); $push->setRootCertificationAuthority('entrust_root_certification_authority.pem'); $push->setProviderCertificatePassphrase('mypassword'); ... 

Un vistazo rápido a /var/log/apache2/error.log indicó el problema:

 PHP Fatal error: Uncaught exception 'ApnsPHP_Exception' with message 'Unable to connect to 'ssl://gateway.push.apple.com:2195': (0)' in /var/www/gettapro/mobile/ApnsPHP/Abstract.php:398\nStack trace:\n#0 /var/www/gettapro/mobile/ApnsPHP/Abstract.php(334): ApnsPHP_Abstract->_connect()\n#1 .... 

Buscar en Google (hay muchas personas que tienen este problema) resultó infructuoso.

Muchos consejos diferentes, tales como Bizzare, como para cambiar los permissions de file del directory que contiene los certificates a 775 … ninguna de las sugerencias me funcionó.

También he probado este cambio en ApnsPHP/Abstract.php (sugerido aquí: https://github.com/duccio/ApnsPHP/issues/29 ) pero sin éxito.

 $streamContext = stream_context_create(array('ssl' => array( //'verify_peer' => isset($this->_sRootCertificationAuthorityFile), 'cafile' => $this->_sRootCertificationAuthorityFile, 'local_cert' => $this->_sProviderCertificateFile ))); 

Esa ApnsPHP_Exception no desapareció.

Por supuesto, también me aseguré de que cuando estaba probando el modo de producción, se utilizaba el token de APNS del dispositivo correcto, tokens de APNS del dispositivo en modo de debugging y producción, no son lo mismo .

De todos modos: los tokens no pueden ser un problema ya que mi script de envío de notifications ni siquiera se puede conectar a ssl://gateway.push.apple.com:2195 .

ssl://gateway.push.apple.com:2195 conectar ssl://gateway.push.apple.com:2195 través de telnet para asegurarme de que: la connection estaba bien.

Se hizo obvio: es un problema de certificate.

Parece que aps_production.cer no debe manejarse de la misma manera que aps_development.cer

Aquí viene el momento RTM .

Descargue e instale el certificate en el llavero (haga doble clic en aps_production.cer )

Exporte una versión .p12 del certificate de producción de aps (también configura una contraseña aquí) desde el Acceso a Llaveros.

Conviértelo en formatting .pem usando este command (deberá ingresar la contraseña aquí):

 openssl pkcs12 -in aps_production.p12 -out final_aps_production.pem -nodes 

Y voilà – todo comenzó a funcionar y soy un campista feliz otra vez.

Hay grandes instrucciones parecidas a un tutorial de Jeremy sobre cómo exportar certificate y key aquí en SO .