ios - direct - Las notificaciones automáticas de APNS no funcionan en la producción
notificaciones push ios (3)
Acabo de encontrar el mismo problema. Las notificaciones automáticas están llegando en modo de desarrollo, no en producción. También revisé todo unas cuantas veces y estaba seguro de que todo estaba bien.
Pero no fue así. Fue el primer paso en el proceso. Creando el csr. Estaba seguro de que no tenía que crear un archivo csr para Desarrollo y Producción y terminé usando el mismo archivo csr para ambos certificados. No funciono ...
Tal vez alguien en el futuro cometa el mismo error y ahorra tiempo ahora.
Creé una aplicación para enviar notificaciones remotas desde un servidor web. Cuando probé la aplicación en el modo de desarrollo, todas las notificaciones llegaron correctamente al teléfono, después de que la AppStore se liberara, la aplicación ya no recibía notificaciones.
Aquí está lo que hice:
- Creó una clave privada para la producción y una para el desarrollo.
- Se generaron en mi ID de aplicación dos Certificados SSL al pasar el anterior CertFile Generated. Estoy 100% seguro de haber generado correctamente la clave 2 y de pasarlas correctamente para descargar el certificado SSL del Dev Center bajo AppID.
- Creé un archivo .pem para desarrollo y otro para producción (convirtiendo el archivo .p12 extraído de mi KeyChain, etc., etc.).
- Creé 2 perfiles de aprovisionamiento diferentes, uno para desarrollo y otro para producción conectado al AppID del paso 1.
- Firmó la aplicación en Crear configuración con los perfiles de aprovisionamiento correctos creados en el paso 4.
- Creé una aplicación web para capturar y almacenar tokens de usuarios.
- Creé una página php para probar el envío de notificaciones push.
Aquí es lo que he probado:
- Probé el desarrollo del archivo .pem generado con telnet en el enlace de sandbox con una respuesta exitosa.
- Probó la producción del archivo .pem generado con telnet en el enlace de producción con una respuesta exitosa.
- Estoy 100% seguro de haber almacenado en mi aplicación web el token de desarrollo de mi iPhone.
- Estoy 100% seguro de haber almacenado en mi servidor de aplicaciones web el token de producción de mi iPhone.
- Estoy 100% seguro de pasar con mi página php el mensaje correcto a Apple Server (tanto para desarrollo como para producción).
- La página php siempre devuelve un mensaje exitoso de Apple Server (tanto para desarrollo como para producción).
Así es como firmo la aplicación en Xcode:
Aquí está el código de la página php para enviar notificaciones:
$ctx = stream_context_create();
//stream_context_set_option($ctx, ''ssl'', ''passphrase'', ''development_pwd'');
//stream_context_set_option($ctx, ''ssl'', ''local_cert'', ''ck_development.pem'');
//$fp = stream_socket_client(''ssl://gateway.sandbox.push.apple.com:2195'', $err, $errstr, 60, STREAM_CLIENT_CONNECT|STREAM_CLIENT_PERSISTENT, $ctx); //test
stream_context_set_option($ctx, ''ssl'', ''passphrase'', ''production_pwd'');
stream_context_set_option($ctx, ''ssl'', ''local_cert'', ''ck_production.pem'');
$fp = stream_socket_client(''ssl://gateway.push.apple.com:2195'', $err, $errstr, 60, STREAM_CLIENT_CONNECT|STREAM_CLIENT_PERSISTENT, $ctx); //production
echo "<p>Connection Open</p>";
if(!$fp){
echo "<p>Failed to connect!<br />Error Number: " . $err . " <br />Code: " . $errstrn . "</p>";
return;
} else {
echo "<p>Sending notification!</p>";
}
$i = 0;
foreach ($deviceToken as $dt) {
$dt = str_replace('' '' , '''' , $dt);
$msg = chr(0) . pack(''n'',32) . pack(''H*'', $dt) . pack(''n'',strlen($payload)) . $payload;
echo "<p>" . $i . " - Message sent: " . $payload . "<br />Token: ". $dt . "<br />***" . $msg . "***</p>";
$result = fwrite($fp, $msg, strlen($msg));
$i++;
if (!$result)
echo ''<p>Message not delivered '' . PHP_EOL . ''!</p>'';
else
echo ''<p>Message successfully delivered '' . PHP_EOL . ''!</p>'';
}
fclose($fp);
echo "<p>Total Notifications Sent: " . $i . "</p>";
echo "<p>Connection Closed!</p>";
}
?>
Conclusiones: Tengo la aplicación de prueba en mi PC que recibe notificaciones automáticas de APNS. Tengo exactamente la misma aplicación publicada en la App Store que no recibe notificaciones automáticas de APNS.
Realmente hice todo lo que estaba a mi alcance para solucionar este problema y leí unas mil páginas de foros, stackoverflow y Apple Documentations.
¡Estoy dispuesto a retribuir a todos ustedes que me ayuden a encontrar la solución a mi problema!
El enlace que mencionaste es Sandbox APNS link. El enlace APNS de producción es según la documentation Apple:
Puede acceder al entorno de producción en gateway.push.apple.com , puerto TCP de salida 2195.
Pocas cosas para verificar:
- Su AppId está habilitado para Distribución APNS.
- Ha creado el Certificado de APNS SSL de Distribución y está instalado en su máquina de compilación (para el envío de la App Store).
- Ha instalado el certificado SSL en el paso 2 en su servidor.
- Usted no está por error utilizando el certificado de desarrollo APNS SSL.
El token de dispositivo para Producción y Sandbox son diferentes para el mismo dispositivo.
Así que trate de obtener el token del dispositivo utilizando certificados Adhoc o de Distribución y use el token generado en la producción, esto funcionó para mí.