Técnica PHP para consultar el servidor de comentarios de APN

8 minutos de lectura

¿Alguien puede aclarar qué quiere el APN (Apple Push Notification) en cuanto a cómo lo consulta?

Los documentos dicen que comienza a enviar tan pronto como se realiza la conexión. ¿Significa esto que no hago un fread() ¿en eso?

Aquí está mi código actual para intentar leerlo. NO puse el fread() en un bucle porque no sé qué respuesta indica “no hay 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 recibo es una respuesta nula. No hay errores por lo que se está conectando.

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

Gracias

  • Incluso tengo un código similar y también me nulo de fread. No estoy seguro de si mi código realmente funciona y APNS está enviando una respuesta NULA o simplemente falta algo. Estoy seguro de que mi conexión con APNS es exitosa. Instalé mi aplicación en unos 5-10 dispositivos y envié un par de alertas y luego desinstalé la aplicación de unos pocos y comencé a enviar las alertas nuevamente para que el servidor de comentarios de APNS nos informara que no se entregó en algunos dispositivos. No tengo nada más que espacios en blanco en fread() 🙁 Si ha hecho algo diferente y lo hizo funcionar, hágamelo saber.

    – Anish

    17 ago. 2009 a las 08:38


  • ¿Has usado “pushutil”? Una vez que lo descubras, es una forma más rápida de verificar el servidor de comentarios. Es una utilidad de Mac OS X que compilas y luego ejecutas desde la línea de comandos de Unix. Google Erica Sadun – está en su sitio bajo Push.

    johnny

    17 ago. 2009 a las 16:19

  • Sigo sin obtener respuesta del servidor de comentarios, incluso cuando envío 76 notificaciones automáticas, algunas de ellas TENÍAN que no tener éxito. Lo mismo sucede cuando utilizo la utilidad de línea de comandos “pushutil” de Erica Sadun: la inserción funciona bien, luego elimino la aplicación y presiono de nuevo, y TODAVÍA no aparece nada en el servidor de comentarios. Y esto es con la aplicación de Erica, así que sé que debe funcionar. Creo que el problema debe ser el certificado. Estoy usando el mismo certificado de producción push que uso para push. No hay un certificado de retroalimentación por separado, ¿verdad?

    johnny

    08 sep. 09 a las 1:09

  • Hoy descubrí que fread() no funcionará porque los comentarios de APN envían datos basura hasta los comentarios reales. Esto hace que fread falle, porque está leyendo datos nulos/vacíos. Como gw1921 menciona a continuación, debe hacer un bucle en feof() hasta strlen(fread($apns, 38)). A partir de ese momento, tendrás comentarios válidos. Luego, descomprima los datos como lo sugiere Nick B a continuación. (Otro problema desagradable: la aplicación desinstalada no generará comentarios a menos que tenga otra aplicación en el dispositivo con el mismo entorno de aps. Por lo tanto, necesita 2 aplicaciones sandbox habilitadas para empujar en su dispositivo para que la desinstalada complete los comentarios).

    – soporte

    17 mayo, 2010 a las 20:18

Aquí hay un gran problema que me confundió cuando intenté conectarme por primera vez: los servidores de retroalimentación de 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á una respuesta NULL a menos que ya esté tratando con un gran volumen de usuarios de su aplicación.

Así que asegúrese de almacenar los tokens de dispositivo vencidos en el disco o en la base de datos, porque después de su consulta de comentarios, se habrán ido para siempre. ¡Esto hace que probar sea un dolor por decir lo menos!

Aquí hay una función completa para obtener los tokens del dispositivo de los servidores de comentarios de APNS (muchas gracias a las respuestas anteriores por ayudarme a ponerlo 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: $errstrn";
        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 así (a través de print_r()):

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

  • Gracias por esta elegante solución. Ahora solo necesito saber cómo comparar la marca de tiempo devuelta por el código de retroalimentación anterior con la marca de tiempo que he guardado en mi base de datos, que por supuesto representa la última vez que el dispositivo me envió un token. ¿Acabo de hacer una comparación de enteros rectos? ¿O tengo que convertir las marcas de tiempo para corregir endianness o algo así?

    johnny

    20 feb.

  • Esta respuesta debería ser la solución aceptada, en mi opinión. Esto es básicamente lo que estoy haciendo, y funciona perfectamente. Si aún no ve datos de comentarios con este método, verifique que tenga otra aplicación en el dispositivo con push habilitado que informe al mismo entorno aps que la aplicación desinstalada. Johnny: con respecto a la marca de tiempo, una vez que la descomprimas como en la publicación de Nick, puedes hacer una comparación de enteros.

    – soporte

    17 mayo, 2010 a las 20:19


  • ¿En qué caso no obtendría una respuesta del servidor de comentarios? Mis notificaciones funcionan bien (como puedo decir de los registros), pero por alguna razón, ¡nunca recibo ninguna notificación en el dispositivo!

    – perdido en el transito

    19 mayo 2011 a las 11:50

  • “Los servidores de comentarios de APNS solo devuelven los tokens de dispositivos que han ‘caducado’ desde su última solicitud de comentarios”. ouch, realmente debería leer la documentación, supongo ;(

    –Daniel Magnusson

    11 abr.

  • Intenté usar esta función. Estoy realmente seguro de que estoy usando la combinación correcta de certificados/servidor. Siempre estoy usando .sandbox. Estoy enviando dos notificaciones automáticas a los dispositivos de desarrollo, un dispositivo recibe el mensaje y la matriz de comentarios está vacía.

    – Julián F. Weinert

    30 oct.

Ese código se ve bien, sin embargo, debe hacer un bucle y verificar el final de la transmisión para leer todos los códigos del dispositivo.

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

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

  • Creo que esta es la idea correcta – $array = unpack(“NnH32”, $resultado); $tiempo de retroalimentación = $fila[0]; $retroalimentaciónLen = $fila[1]; $retroalimentaciónUDID = $fila[2]; Eso desempaqueta los 38 bytes enviados por el servidor de comentarios. Sin embargo, el valor de fecha de 32 bits está en orden de red o big-endian. Si alguien puede proporcionar una función de PHP que cambiará estos 4 bytes al orden de Intel (little-endian), creo que tenemos la solución. NOTA: el UDID real es una cadena de caracteres y NO necesita cambiar su orden.

    johnny

    15 oct.

  • ¿Esto es bueno? ——— /* Convertir flotante de HostOrder a Network Order / function FToN( $val ) { $a = desempaquetar(“I”,empaquetar( “f”,$val )); paquete devuelto(“N”,$a[1] ); } / Convertir flotante de Network Order a HostOrder */ function NToF($val ) { $a = unpack(“N”,$val); $b = desempaquetar(“f”,empaquetar( “I”,$a[1])); devolver $b[1]; }

    – extraño

    15 oct.

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

“Bueno, por tonto que parezca, encontré una solución:

Cree una identificación de aplicación ficticia en el portal del programa, habilite las notificaciones push de desarrollo en él. Cree y descargue el perfil de aprovisionamiento asociado. Cree un nuevo proyecto de xcode e invoque el método registerForRemoteNotificationTypes al inicio. Instale la aplicación ficticia en su dispositivo. En este punto, debería 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 automáticas. Desinstale la aplicación original e intente enviar una notificación automática a esa aplicación. Invoque el servicio de comentarios y debería recibir los datos”.

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 verifica el token del dispositivo con la marca de tiempo!

Acabo de empezar a usar esta biblioteca. ¡Funciona muy bien para mí!

https://github.com/mac-cain13/notificato

.

¿Ha sido útil esta solución?

Esta web utiliza cookies propias y de terceros para su correcto funcionamiento y para fines analíticos y para mostrarte publicidad relacionada con sus preferencias en base a un perfil elaborado a partir de tus hábitos de navegación. Al hacer clic en el botón Aceptar, acepta el uso de estas tecnologías y el procesamiento de tus datos para estos propósitos. Configurar y más información
Privacidad