2012-01-02 12 views
5

He implementado con éxito la notificación de inserción de Android usando google c2dm. Siempre envío una solicitud de publicación de un dispositivo y un dispositivo demora de 1 a 2 segundos. Por lo tanto, si tengo 1000 dispositivos, mi script necesitará más de 1000 segundos para finalizar el envío a todos los dispositivos.notificación de inserción de Android a muchos dispositivos a la vez utilizando google c2dm

Lo que quiero saber es, ¿podemos enviar la solicitud de publicación de todos los dispositivos a google c2dm? Si podemos, ¿cómo hacer?

Estoy usando PHP script.

Aquí está mi código para empujar un mensaje a un dispositivo:

function sendMessageToPhone($authCode, $deviceRegistrationId, $msgType, $messageText, $infoType, $messageInfo) { 

    $headers = array('Authorization: GoogleLogin auth=' . $authCode); 
    $data = array(
     'registration_id' => $deviceRegistrationId, 
     'collapse_key' => $msgType, 
     'data.message' => $messageText, 
     'data.type' => $infoType, 
     'data.data' => $messageInfo 
    ); 

    $ch = curl_init(); 

    curl_setopt($ch, CURLOPT_URL, "https://android.apis.google.com/c2dm/send"); 
    if ($headers) 
     curl_setopt($ch, CURLOPT_HTTPHEADER, $headers); 
    curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false); 
    curl_setopt($ch, CURLOPT_POST, true); 
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); 

    curl_setopt($ch, CURLOPT_POSTFIELDS, $data); 

    $response = curl_exec($ch); 

    curl_close($ch); 

    return $response; 
} 

Si tengo más dispositivos de E bucle de esta manera:

while($row = mysql_fetch_assoc($result)) { 

    sendMessageToPhone($authCode, $row['deviceRegistrationId'], GOOGLE_MSG_TYPE, $messageText, $infoType, $messageInfo); 

} 

Gracias por ayudar.

+0

Usted debe agregar el fragmento de código que muestra cómo que usted envía sus eventos de manera que se pueden hacer sugerencias. – hakre

Respuesta

2

La autenticación es la acción más expansiva (en el tiempo) en todo el proceso, probablemente por eso tiene un retraso de 1 segundo entre cada envío.

Para acelerar el proceso, no debe autenticarse cada vez. Simplemente auth una vez, y obtenga el token de autenticación. Este token tiene un cierto TTL, pero Google no especifica nada. Luego recorra sus dispositivos y envíe usando el token de autenticación anterior. El token de autenticación puede cambiar (raramente) y se puede encontrar en el encabezado de respuesta Update-Client-Auth.

Todo el proceso no debería tomar más los pocos cientos de ms por dispositivo.

También puedes utilizar stream en lugar de rizo

+0

Entonces, ¿puedes llevarme a hacer eso? – Kannika

+0

Ya has hecho todo el trabajo. Solo asegúrese de realizar la autenticación una vez (y no cada vez que envíe un mensaje de texto). Tal vez agregue algunos puntos de referencia en su código para encontrar la parte que ralentice el script. Usar la transmisión no es obligatorio. – grunk

0
function sendMessageToPhone($authCode, $deviceRegistrationId, $msgType, $messageText, $infoType, $messageInfo) { 

    $headers = array('Authorization: GoogleLogin auth=' . $authCode); 
    $data = array(
     'registration_id' => $deviceRegistrationId, 
     'collapse_key' => $msgType, 
     'data.message' => $messageText, 
     'data.type' => $infoType, 
     'data.data' => $messageInfo 
    ); 

    $ch = curl_init(); 

    curl_setopt($ch, CURLOPT_URL, "https://android.apis.google.com/c2dm/send"); 
    if ($headers) 
     curl_setopt($ch, CURLOPT_HTTPHEADER, $headers); 
    curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false); 
    curl_setopt($ch, CURLOPT_POST, true); 
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); 

    curl_setopt($ch, CURLOPT_POSTFIELDS, $data); 

    $response = curl_exec($ch); 

    curl_close($ch); 

    return $response; 
} 
+0

¿cuál es la diferencia con el código OP? (y por qué) –

Cuestiones relacionadas