Alguien puede aclarar lo de la Apn (Notificaciones Push de Apple) quiere tan lejos como usted la consulta?

La documentación decir que se inicia el envío tan pronto como se realiza la conexión. ¿Significa esto que no hago un fread() en él?

Aquí está mi código actual para intentar leerlo. NO puse el fread() en un bucle como no sé cuál es la respuesta indica que «no hay más registros a leer» y yo 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 estoy consiguiendo es una nula respuesta. No hay errores por lo que se está conectando.

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

Gracias

  • Incluso tengo un código similar y yo también te nulo de fread. No se si mi código es realmente de trabajo y de APN es el envío de una NULA respuesta o simplemente falta algo. Estoy seguro de que mi conexión a APN es correcta. Yo había instalado mi aplicación en unos 5-10 dispositivos y enviar un par de alertas y, a continuación, desinstalar la aplicación a partir de unos pocos y empezaron a enviar las alertas de nuevo para que los APN de retroalimentación servidor nos dejó saber que no se pudo entregar en algunos dispositivos. No tengo otra cosa que en blanco en fread() 🙁 Si se ha hecho algo diferente y tengo trabajo por favor, hágamelo saber.
  • Han utilizado «pushutil»? Una vez que la figura fuera de una manera más rápida de comprobar la retroalimentación del servidor. Es un Mac OS X utilidad que compilar y ejecutar desde la línea de comandos de Unix. Google Erica Sadun – está en su sitio bajo el Empuje.
  • Todavía no hay respuesta de la retroalimentación en el servidor, incluso cuando me envía 76 notificaciones push – algunos de ellos TUVIERON que ser incorrecta. Lo mismo sucede cuando utilizo Erica Sadun del «pushutil» utilidad de línea de comandos – el empuje va a través multa, luego me quite la aplicación y pulse de nuevo, y TODAVÍA nada nunca sale en los comentarios servidor. Y esto es con Erica de la aplicación, así que sé que debe trabajar. Creo que el problema debe ser el certificado. Estoy utilizando el mismo empuje-producción cert que yo uso para empujar. Ya no hay una retroalimentación cert, ¿no?
  • Hoy me he encontrado que fread() no funciona porque los Apn comentarios se envía basura de datos hasta el real de la retroalimentación. Esto hace que fread a fallar, porque es lectura null/vacío de datos. Como gw1921 menciona a continuación, usted debe bucle en feof() hasta strlen(fread($apn, 38)). A partir de ese punto, usted tendrá validez de retroalimentación. Entonces, desempaquetar los datos como Nick B a continuación se ha sugerido. (Otra desagradable gotcha: la desinstalado la aplicación no va a generar un feedback a menos que haya otra aplicación en el dispositivo con el mismo tamaño de sensor aps-medio ambiente. Por lo que necesita el empuje 2-habilitado el entorno limitado de aplicaciones en tu dispositivo para el desinstala uno para llenar de comentarios.)
InformationsquelleAutor | 2009-08-14

5 Comentarios

  1. 69

    Aquí hay un gran problema que me confunde cuando probé por primera vez la conexión: los APN comentarios solo los servidores de devolver el dispositivo de fichas que se han «caducado» desde su última petición de feedback. Que significa que la mayoría de los casos, se obtendrá una respuesta NULL a menos que usted ya está tratando con un alto volumen de usuarios de la aplicación.

    Así que asegúrese de almacenar el último dispositivo de fichas para el disco o la base de datos, debido a que después de sus comentarios de la consulta que se ha ido para bien. Esto hace que la prueba de que un dolor de por lo menos!

    Aquí una función completa para recuperar el dispositivo fichas de los APN de retroalimentación de los servidores (muchas gracias a las respuestas de arriba para 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: $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á algo como esto (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 solución elegante. Ahora sólo necesito saber cómo comparar la marca de hora devuelto por la por encima de las opiniones de código a la de hora que he guardado en mi base de datos, que representa la última vez que el dispositivo se me envió un token. Sólo debo hacer una escalera entero comparar? O tengo que convertir las marcas de tiempo para corregir el endianness o algo?
    • Esta respuesta debería ser la aceptación de la solución, de la OMI. Esto es básicamente lo que estoy haciendo, y funciona perfectamente. Si todavía no estás viendo la retroalimentación de datos con este método, compruebe que dispone de otra aplicación en el dispositivo w/push que los informes de la misma aps-medio ambiente como desinstalar la aplicación. Johnny – en cuanto a la hora, una vez que se descomprime como en el Nick del post, usted puede hacer un número entero comparar.
    • En el que caso no me dan una respuesta a partir de los comentarios de servidor? A mi las notificaciones de ir a través de la fina (como lo que puedo decir de los registros), pero por alguna razón nunca me reciben notificaciones en el dispositivo!
    • «el APN comentarios solo los servidores de devolver el dispositivo de fichas que se han «caducado» desde su última petición de feedback.» ¡ay, yo realmente debe leer la documentación, supongo ;(
    • He intentado utilizar esta función. Estoy muy seguro de que estoy usando el derecho certs / combinado de servidor. Siempre estoy usando .sandbox. Estoy enviando dos notificaciones de inserción a dev dispositivos, un dispositivo que recibe el mensaje y la retroalimentación de la matriz está vacía.
    • En lugar de comprobar la marca de tiempo, no puedo simplemente de verificación para todos los devuelve fichas y, a continuación, quitar de mi base de datos?
    • Absolutamente. Eso es lo que hacemos en nuestra implementación de la marca de tiempo de datos no es muy valioso para nosotros, así que lo ignore.
    • es el código que has publicado aquí, lo que usted utiliza actualmente para la detección de dispositivo no válido tokens? He pasado una semana, finalmente, llegar a mi las notificaciones push funciona a la PERFECCIÓN excepto por el hecho de que mientras que el envío de la relación con la apn se ha caído tan pronto como un viejo / no válido dispositivo token es detectado / el intento. Traté de usar el código de aquí, la sustitución de mi certificado y de la serie de fichas, pero me sale nada.
    • Sí, todavía utilizamos este código en nuestra producción de aplicaciones. Se ejecuta como una hora de trabajo cron, separados de nuestros principales APN de conexión.
    • ahora el código devuelve todos los dispositivos de tokens y marca de hora no está allí.

  2. 2

    Que el código que se ve a la derecha sin embargo, usted necesita bucle y verificación para el final de la secuencia en orden a leer todos los códigos de dispositivo.

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

    Sin embargo, mi problema es el desembalaje de los datos. ¿Alguien sabe cómo desempaquetar los datos binarios que usted acaba de leer para obtener la ID del dispositivo real (como cadena) junto con la fecha y hora, etc?

    • Creo que esta es la idea de derecho – $matriz = unpack(«NnH32», $resultado); $feedbackTime = $fila[0]; $feedbackLen = $row[1]; $feedbackUDID = $fila[2]; Que desempaqueta el 38 bytes enviados por el feedback del servidor. Sin embargo, la de 32 bits valor de fecha es en la red de la orden, o big-endian. Si alguien puede proporcionar una función de PHP que le dará la vuelta de 4 bytes para Intel (little-endian) fin, creo que tenemos la solución. NOTA: el real de la CIUD es una cadena de caracteres y NO necesita tener su orden girada.
    • Esta buena? ——— /* Convertir flotador de HostOrder a la Red de Fin de / función FToN( $val ) { $a = unpack(«me»,pack( «f»,$val )); return pack(«N»,$a[1] ); } / Convertir de flotación de la Red para HostOrder */ function NToF($val ) { $a = unpack(«N»,$val); $b = unpack(«f»,pack( «I»,$a[1])); return $b[1]; }
  3. 1

    Tengo la solución de apple foro y es para el desarrollo. La prueba de producción también.

    «Bien, tan tonto como suena, he encontrado una solución:

    Crear un muñeco de id de la aplicación en el portal del programa, permiten el desarrollo de las notificaciones push en él
    Crear y descargar los asociados de aprovisionamiento de perfil
    Crear un nuevo proyecto de xcode, y la invocación de la registerForRemoteNotificationTypes método de inicio.
    Instalar el maniquí de aplicación en su dispositivo. En este punto, usted debe tener dos de DESARROLLO de aplicaciones que se ejecutan en el dispositivo: la aplicación original y el maniquí de la aplicación. Ambos deben ser registrados para recibir las notificaciones push.
    Desinstalar la aplicación original, y tratar de enviar una notificación de inserción a la aplicación.
    Invocar la retroalimentación de servicio, y usted debe recibir los datos de vuelta.»

  4. 0

    Este último trabajó 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, a continuación, sólo tiene que comprobar para el dispositivo token en contra de la marca de tiempo!

    • Esto funciona muy bien, gw1921. Yo soy el almacenamiento de los $feedbackDate en una columna de SQL por ahora. ¿Qué tipo de datos debe la columna? Me puse a Entero y que me está dando «2009». Las otras 2 columnas, la longitud y el token, GRAN trabajo!! Gracias

Dejar respuesta

Please enter your comment!
Please enter your name here