2012-01-02 14 views
5

Ho implementato con successo la notifica push Android utilizzando google c2dm. Invio sempre una richiesta di post per un dispositivo e un dispositivo si ritarda per 1-2 secondi. Quindi, se ho 1000 dispositivi, il mio script avrà bisogno di più di 1000 secondi per completare la spinta su tutti i dispositivi.notifica push Android a molti dispositivi contemporaneamente con google c2dm

La cosa che voglio sapere è, possiamo inviare la richiesta di post per tutti i dispositivi a google c2dm? Se possiamo, come fare?

Sto usando script PHP.

Ecco il mio codice di spingere un messaggio 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; 
} 

Se ho più dispositivi di I ciclo in questo modo:

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

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

} 

Grazie per l'aiuto.

+0

Si dovrebbe aggiungere il frammento di codice che si mostra come si inviano gli eventi in modo che i suggerimenti possono essere fatte. – hakre

risposta

2

L'autenticazione è l'azione più estesa (nel tempo) in tutto il processo, che probabilmente è il motivo per cui si ha un ritardo di 1 secondo tra ogni invio.

Per accelerare il processo, non è necessario autenticarsi ogni volta. Basta eseguire l'auth una volta e ottenere il token di autenticazione. Questo token ha un certo TTL ma nulla viene specificato da Google. Quindi esegui il loop sui tuoi dispositivi e invia utilizzando il token di autenticazione precedente. Il token di autenticazione può cambiare (raramente) e può essere trovato nell'intestazione di risposta Update-Client-Auth.

L'intero processo non dovrebbe richiedere più di poche centinaia di ms dal dispositivo.

Considera anche utilizzando stream invece di ricciolo

+0

Quindi, puoi portarmi a farlo? – Kannika

+0

Hai già fatto tutto il lavoro. Assicurati di eseguire l'autenticazione una sola volta (e non ogni volta che invii un messaggio). Forse aggiungi qualche benchmark nel tuo codice per trovare la parte che rallenta lo script. L'uso dello streaming non è obbligatorio. – 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

qual è la differenza con il codice OPs? (e perché) –

Problemi correlati