Notificaciones de Apple Push no funcionan en producción

Con mi aplicación en la App Store, las notifications push no funcionan. Con mi aplicación en desarrollo, las notifications push funcionan.

Creo que debería haber probado a través de un deployment Ad Hoc. De todos modos, esto es lo que sé …

ID de la aplicación

mi ID de la aplicación es com.MyName.My-App

Tiene notifications push habilitadas para desarrollo y distribución.

introduzca la descripción de la imagen aquí

Certificados de APNs

Tengo certificates de desarrollo y distribución. Es el Dist que me importa.

introduzca la descripción de la imagen aquí

Tiene el nombre com.MyName.My-App

Exportar a un PEM

Seleccioné el certificate y la key privada y lo exporté de la siguiente manera:

introduzca la descripción de la imagen aquí

y la contraseña lo protegió.

Entonces corrí

openssl pkcs12 -in Certificates.p12 -out pushcert.pem -nodes -clcerts 

proporcionando la contraseña y obteniendo con éxito la salida pushcert.pem .

Descargando la aplicación

Eliminé el token del dispositivo del lado del server para mi dispositivo, descargo mi aplicación de la tienda de aplicaciones, la abrí y acepté Notificaciones Push, y luego inicié session en mi server para verificar el token de mi dispositivo. Tengo mi token de dispositivo de producción ahora. Ejecuté este script php simple (que funciona cuando suministro mi ficha de dispositivo de desarrollo), pero falla con mi token de dispositivo de producción.

 <?php // Put your device token here (without spaces): $deviceToken = 'myProductionDeviceTokenInHere'; // Put your private key's passphrase here: $passphrase = 'myPasswordIsInHere'; // Put your alert message here: $message = 'Test'; //////////////////////////////////////////////////////////////////////////////// $ctx = stream_context_create(); stream_context_set_option($ctx, 'ssl', 'local_cert', 'pushcert.pem'); stream_context_set_option($ctx, 'ssl', 'passphrase', $passphrase); stream_context_set_option($ctx, 'ssl', 'cafile', 'entrust_2048_ca.cer'); // Open a connection to the APNS server $fp = stream_socket_client( 'ssl://gateway.push.apple.com:2195', $err, $errstr, 60, STREAM_CLIENT_CONNECT|STREAM_CLIENT_PERSISTENT, $ctx); if (!$fp) exit("Failed to connect: $err $errstr" . PHP_EOL); echo 'Connected to APNS' . PHP_EOL; // Create the payload body $body['aps'] = array( 'alert' => $message, 'sound' => 'default' ); // Encode the payload as JSON $payload = json_encode($body); // Build the binary notification $msg = chr(0) . pack('n', 32) . pack('H*', $deviceToken) . pack('n', strlen($payload)) . $payload; // Send it to the server $result = fwrite($fp, $msg, strlen($msg)); if (!$result) echo 'Message not delivenetworking' . PHP_EOL; else echo 'Message successfully delivenetworking' . PHP_EOL; // Close the connection to the server fclose($fp); 

¿Por qué está fallando? Funciona con mi token de dispositivo de desarrollo, pero no con mi token de dispositivo de producción. ¿No he hecho algo correctamente?

Lo que está sucediendo es que es probable que se esté distribuyendo con un perfil de aprovisionamiento incorrecto. Para recibir notifications push en la versión final, debe tener el perfil de aprovisionamiento más reciente instalado en el que ya haya habilitado las notifications push para su distribución. Este es el error más común y lo encontré una o dos veces en el pasado.

Entonces, debes seguir los siguientes pasos:

  • Inicie session en el Centro de desarrolladores de Apple
  • Cree un nuevo perfil de aprovisionamiento para este ID de la aplicación para su distribución. Captura de pantalla
  • Continúe configurándolo completamente, ingresando todos los detalles necesarios
  • Descargue el perfil y haga doble clic para instalarlo.
  • En su proyecto en Build Settings-> Code Signing -> Distribution select su perfil recién creado
  • Ahora las notifications push llegarán al usuario final también en las comstackciones de distribución.

Espero que eso ayude, Julian.

¡Asegúrate de no usar el certificate sandbox en el server! tienes que cambiar esto para que funcione desde sandbox a prod.

Resultó que era un problema con el tercero Ruby Gem que estaba usando (rpush). No estoy seguro de qué, pero tan pronto como lo cambié, todo ha sido genial.