todas las etiquetas cortas codigo cerrar abrir php push-notification stream apple-push-notifications fread

las - php short tags



Técnica de PHP para consultar el servidor de comentarios APN (5)

¿Puede alguien aclarar qué quiere la APN (Apple Push Notification) en cuanto a cómo la consulta?

Los documentos dicen que comienza a enviar tan pronto como se realiza la conexión. ¿Esto significa que no hago un fread() en él?

Aquí está mi código actual para intentar leerlo. NO puse el fread() en un bucle ya que no sé qué respuesta indica "no más registros para leer" y no quería un bucle infinito en mi servidor.

<?php $apnsCert = ''HOHRO-prod.pem''; $streamContext = stream_context_create(); stream_context_set_option($streamContext, ''ssl'', ''local_cert'', $apnsCert); stream_context_set_option($streamContext, ''ssl'', ''verify_peer'', false); $apns = stream_socket_client(''ssl://feedback.push.apple.com:2196'', $error, $errorString, 60, STREAM_CLIENT_CONNECT, $streamContext); echo ''error='' . $error; echo ''errorString='' . $errorString; $result = fread($apns, 38); echo ''result='' . $result; fclose($apns); ?>

Hasta ahora todo lo que obtengo es una respuesta nula. No hay errores, entonces se está conectando.

No sé si la respuesta nula significa que no hay datos, o que mi fread() es la forma incorrecta de hacerlo.

Gracias



Ese código se ve bien, sin embargo, debe realizar un ciclo y verificar el final del flujo para leer todos los códigos del dispositivo.

while (!feof($apns)) { $devcon = fread($apns, 38); }

Sin embargo, mi problema es el desempaquetado de los datos. ¿Alguien sabe cómo descomprimir los datos binarios que acaba de leer para obtener la identificación del dispositivo real (como cadena) junto con la marca de tiempo, etc.?


Esto finalmente funcionó para mí.

$arr = unpack("H*", $devconts); $rawhex = trim(implode("", $arr)); $feedbackTime = hexdec(substr($rawhex, 0, 8)); $feedbackDate = date(''Y-m-d H:i'', $feedbackTime); $feedbackLen = hexdec(substr($rawhex, 8, 4)); $feedbackDeviceToken = substr($rawhex, 12, 64);

¡Y luego simplemente verificas el token del dispositivo contra la marca de tiempo!


He aquí un gran problema que me confundió la primera vez que intenté conectarme: los servidores de comentarios APNS solo devuelven los tokens del dispositivo que han "caducado" desde su última solicitud de comentarios . Lo que significa que la mayoría de las veces obtendrás una respuesta NULA a menos que ya estés lidiando con un gran volumen de usuarios de tu aplicación.

Así que asegúrese de guardar los tokens de dispositivo caducados en el disco o db, ya que después de su consulta de retroalimentación se han ido para siempre. ¡Esto hace que las pruebas sean dolorosas por decir lo menos!

Aquí hay una función completa para recuperar los tokens del dispositivo de los servidores de comentarios APNS (muchas gracias a las respuestas anteriores para ayudarme a poner todo junto):

function send_feedback_request() { //connect to the APNS feedback servers //make sure you''re using the right dev/production server & cert combo! $stream_context = stream_context_create(); stream_context_set_option($stream_context, ''ssl'', ''local_cert'', ''/path/to/my/cert.pem''); $apns = stream_socket_client(''ssl://feedback.push.apple.com:2196'', $errcode, $errstr, 60, STREAM_CLIENT_CONNECT, $stream_context); if(!$apns) { echo "ERROR $errcode: $errstr/n"; return; } $feedback_tokens = array(); //and read the data on the connection: while(!feof($apns)) { $data = fread($apns, 38); if(strlen($data)) { $feedback_tokens[] = unpack("N1timestamp/n1length/H*devtoken", $data); } } fclose($apns); return $feedback_tokens; }

Si todo está bien, los valores de retorno de esta función se verán más o menos así (a través de print_r ()):

Array ( Array ( [timestamp] => 1266604759 [length] => 32 [devtoken] => abc1234..............etcetc ), Array ( [timestamp] => 1266604922 [length] => 32 [devtoken] => def56789..............etcetc ), )


Obtuve la solución del foro de Apple y es para el desarrollo. Prueba esto también para la producción.

"Bueno, tan tonto como suena, encontré una solución:

Cree una identificación de aplicación ficticia en el portal del programa, habilite las notificaciones de desarrollo push en ella Cree y descargue el perfil de suministro asociado Cree un nuevo proyecto xcode e invoque el método registerForRemoteNotificationTypes al inicio. Instale la aplicación ficticia en su dispositivo. En este punto, debe tener dos aplicaciones de DESARROLLO ejecutándose en su dispositivo: la aplicación original y la aplicación ficticia. Ambos deben estar registrados para recibir notificaciones push. Desinstale la aplicación original e intente enviar una notificación automática a esa aplicación. Invoca el servicio de comentarios, y deberías recibir datos de vuelta ".