2010-04-06 11 views
17

Estoy usando PHP para conectarme a apn s para enviar algunas notificaciones a varios dispositivos, aunque la pregunta es más conceptual, por lo que no tiene que ser específica de PHP.Apple Push Notification: Envío de grandes volúmenes de mensajes

Enviaré alrededor de 7000 dispositivos (y en crecimiento), todo al mismo tiempo. Mi proceso se ejecuta UNA VEZ por día y se transmite a todos los dispositivos, por lo que no estoy constantemente reabriendo una conexión.

Actualmente puedo enviar fácilmente a 2 dispositivos a la vez y los mensajes se entregarán con éxito. Sin embargo, cuando intento enviar a los 7000 dispositivos completos, los mensajes no parecen entregarse.

El pseudo-lógica para mi código es:

open connection to apple 
loop over device-tokens 
    write to socket connection per device 
end loop 
close connection to apple. 

he visto en alguna parte que sólo debería realizar una escritura SOLA, y construir una enorme cuerpo, en otras palabras, el pseudo-código se vería así:

loop over device tokens 
    create payload aggregating all devices 
end loop 
open connection to apple 
write to socket ONCE with whole payload for 7000 devices 
close connection 

Es difícil de probar ya que obviamente no puedo enviar mensajes de prueba a mis 7000 usuarios de producción. ¿Alguien más ha tenido un problema similar?

Gracias

+0

¿Alguna vez hizo que esto funcionara? Pronto escribiré una aplicación que enfrentará el mismo problema: transmitirla a miles de clientes a través de APNS. –

+3

Hola Mike. Sí, lo hice. La implementación en el momento en que publiqué esta pregunta estaba en las primeras etapas. El problema fue que tenía algunos dispositivos de espacio aislado en la misma mesa que los dispositivos de producción. Apple a veces abandona la conexión si la envía a un dispositivo_contacto_token mientras usa los certificados de producción. Entonces, la solución simple es simplemente verificar que se haya escrito la cantidad correcta de bytes en la conexión y que la conexión no haya caído después de cada evento de escritura. Si se cae, debes volver a abrir la conexión y continuar desde donde la dejaste. ¡buena suerte! – BoomShaka

+0

FYI, puede abrir la conexión y realizar tantas escrituras como desee. solo asegúrese de verificar el estado de la conexión después de escribir – BoomShaka

Respuesta

5

que he leído que Apple se preocupa por el número de conexiones que realice en sus servidores, pero nunca he oído sobre cualquier límite de escritura. Además, no estoy seguro del tipo de respuesta que recibiría aquí, pero podría valer la pena intentarlo para ver qué sucede. Tal vez experimente con el servidor de notificación de inserción de recinto de seguridad, solo utilizando los tokens del dispositivo de los dispositivos de producción. Esos teléfonos no deberían recibir notificaciones push enviadas al servidor de la zona de pruebas y si la zona de pruebas informa "entregado satisfactoriamente", sería una forma de prueba sin preocupaciones.

+0

vencido. pero tu respuesta fue esencialmente correcta. gracias :) – BoomShaka

+0

La caja de arena necesita un certificado de desarrollo y la producción necesita certificados de producción. El documento APNS dice que los tokens de dispositivos que se generan para el desarrollo (entorno de entorno de prueba) son totalmente diferentes de la creación de producción. También la construcción de producción APNS si obtiene un token de dispositivo generado por la compilación de desarrollo invalida directamente el token del dispositivo y elimina la conexión. Por lo tanto, el estado no será exitoso, pero la conexión se eliminará. Para probar burlarse, el servicio APNS es una mejor opción. –

-1

Veo lo que quiere y más bien, tuve el mismo problema, lo que funcionó para mí fue la ingeniería inversa. Acabo de mirar en la biblioteca y comprobé la función que valida el dispositivo Retiro. Por lo tanto, al crear un token de dispositivo ficticio, me aseguré de que el token generado sea válido según la biblioteca.

El siguiente código le permitirá generar tokens de dispositivo válidos, ahora le indica cuántos millones de tokens generar utilizando esta función.

def generateRandomDeviceTokenAndAppendItToJson(tokenLength: Int) { 
    val randomlyGeneratedDeviceToken = new StringBuilder() 
     randomlyGeneratedDeviceToken.append("   \"") 
     (1 to tokenLength) foreach { 
     times: Int => 
     if (tokenLength equals Device.Apple) 
     randomlyGeneratedDeviceToken.append(validCharacter().toString.charAt(0)) 
     else 
     randomlyGeneratedDeviceToken.append(Random.alphanumeric.head) 
     } 
     randomlyGeneratedDeviceToken.append("\",") 
     println(randomlyGeneratedDeviceToken) 
     writer.write(randomlyGeneratedDeviceToken.toString()) 
     } 

     private def validCharacter(): Int = { 
     val a = Random.alphanumeric.head 
     if ('0' <= a && a <= '9') 
     return (a - '0') 
     else if ('a' <= a && a <= 'f') 
     return ((a - 'a') + 10) 
     else if ('A' <= a && a <= 'F') 
     return ((a - 'A') + 10) 
     validCharacter() 
    } 

El dispositivo de appleToken es de 64 caracteres, por lo que tendrá que repetirlo 64 veces.

+0

Dudo que esto pueda funcionar. Es posible que hayas diseñado por ingeniería inversa una validación de bajo nivel que solo verifique la corrección de un token * hasta cierto punto *. Pero esa es solo la primera línea de defensa de Apple para evitar cualquier correo no deseado. Podría apostar en un millón de dólares que no puedes enviar mensajes en la naturaleza a dispositivosTokens al azar. Apple te cerraría rápidamente. Incluso si funcionara con el servidor de espacio aislado, tal prueba no probaría nada en mi opinión. –

+0

Por cierto, no hubo ninguna validación? Debido a su código, parece que simplemente genera una longitud de 64 caracteres de cadena * de caracteres hex * completamente aleatorios. Sin restricciones de ningún tipo. –

+0

De acuerdo Csaba Toth, esto genera cadena aleatoria de 64 caracteres, pero la validación (ver la función de caracteres válidos más arriba) es la misma (me llevó a analizar fichas en lugar de encontrarla en algún lugar de la red) lo que apns hace en su extremo, y funcionó para mí probar el rendimiento de mi servidor. Pruébalo e intenta enviarlo a apns, se informará que es válido. Por supuesto, podrían ser tokens reales generados, deberíamos ser lo suficientemente cortés como para enviarlos en el entorno de sandbox, de lo contrario, como dijiste, sería spam. –

Cuestiones relacionadas