2013-06-04 2 views
12

ich eine Frage über Google Cloud Messaging ... bekam ungültige Registrierungs-ID vom Server entfernenWie GCM reagieren analysieren mit php

I GCM an Google für 3 Anmeldung IDs, dann antwortet Google, dass 2 der Registrierung IDs wurden erfolgreich gesendet und eine nicht, weil die Registrierungs-ID falsch war!

Aber es ist mir nicht-ID, die Registrierung gesendet hier ist nicht ...

Nun meine Frage: wie kann ich die Google GCM Antwort analysieren, die zu erhalten, die Registrierungs-ID wurde nicht versendet? Hat Google eine API oder so, dass ich es "multicat_id" geben kann und mir sagt, welche Registrierungs-ID ein Problem hatte?

Jede Hilfe so sehr geschätzt werden würde, bin ich nur so verwirrt :)

Antwort

15

Es basiert auf der Reihenfolge:

{ "collapse_key": "score_update", 
    "time_to_live": 108, 
    "delay_while_idle": true, 
    "data": { 
    "score": "4x8", 
    "time": "15:16.2342" 
    }, 
    "registration_ids":["4", "8", "15", "16", "23", "42"] 
} 

Und bekommen diese Antwort:

Sie dieses Angenommen schicken von Google:

{ "multicast_id": 216, 
    "success": 3, 
    "failure": 3, 
    "canonical_ids": 1, 
    "results": [ 
    { "message_id": "1:0408" }, 
    { "error": "Unavailable" }, 
    { "error": "InvalidRegistration" }, 
    { "message_id": "1:1516" }, 
    { "message_id": "1:2342", "registration_id": "32" }, 
    { "error": "NotRegistered"} 
    ] 
} 

Dies bedeutet, dass die 3. Registrierungs-ID, die Sie gesendet haben (15), in ist gültig und der 6. (42) ist nicht registriert. Beide sollten aus Ihrer DB entfernt werden.

+0

Sehr hilfreiche Antwort. Teilen Sie einfach die Antwort mit "result" und teilen Sie das zweite Argument mit "," und führen Sie die Schleife durch, was auch immer Sie benötigen. –

9

Hier ist, wie ich es tat:

$gcm_result = $gcm->send_notification($registration_ids, $message); 
$jsonArray = json_decode($gcm_result); 

if(!empty($jsonArray->results)){ 

    $remove_ids = array(); 

    for($i=0; $i<count($jsonArray->results);$i++){ 
     if(isset($jsonArray->results[$i]->error)){ 
      if($jsonArray->results[$i]->error == "NotRegistered"){ 
       $remove_ids[$i] = "'".$registration_ids[$i]."'"; 
      } 
     } 
    } 

    if(!empty($remove_ids)){ 

     $remove_ids_string = implode(', ',$remove_ids); 
     include_once SCRIPTS.'gcm_server_php/db_functions.php'; 
     $dbf = new DB_Functions(); 
     $res = $dbf->deleteUsers($remove_ids_string); 
     echo count($remove_ids)." users have unregistered from notifications since the last one was sent out."; 

    } 
} 
+0

Und incase someoen sucht nach Deleteusers Funktion hier ist es. öffentliche Funktion deleteUsers ($ remove_ids_string) { \t $ registration_ids = explode (",", $ remove_ids_string); \t foreach ($ registration_ids wie $ Wort) \t \t { \t \t \t \t \t \t $ result = mysql_query ("Löschen von notification_tbl WHERE gcm_id = '$ word'"); \t \t \t \t \t} \t \t } –

2

Nach dem, was ich hier lesen:

http://developer.android.com/google/gcm/http.html#error_codes http://developer.android.com/google/gcm/server-ref.html#error-codes

ich entwickelt habe wie folgt (noch nicht getestet):

$result = $gcm->send_notification($registration_ids, $message); 
$jsonArray = json_decode($result); 

if($jsonArray->canonical_ids != 0 || $jsonArray->failure != 0){ 
    if(!empty($jsonArray->results)) 
    { 
     for($i = 0 ; $i<count($jsonArray->results) ; $i++){ 
      $result = $jsonArray->results[$i]; 
      if(isset($result->message_id) && isset($result->registration_id)) 
      { 
       // You should replace the original ID with the new value (canonical ID) in your server database 
      } 
      else 
      { 
       if(isset($result->error)) 
       { 
        switch ($result->error) 
        { 
         case "NotRegistered": 
         case "InvalidRegistration": 
          // You should remove the registration ID from your server database 
          break; 
         case "Unavailable": 
         case "InternalServerError": 
          // You could retry to send it late in another request. 
          break; 
         case "MissingRegistration": 
          // Check that the request contains a registration ID 
          break; 
         case "InvalidPackageName": 
          // Make sure the message was addressed to a registration ID whose package name matches the value passed in the request. 
          break; 
         case "MismatchSenderId": 
          // Invalid SENDER_ID 
          break; 
         case "MessageTooBig": 
          // Check that the total size of the payload data included in a message does not exceed 4096 bytes 
          break; 
         case "InvalidDataKey": 
          // Check that the payload data does not contain a key that is used internally by GCM. 
          break; 
         case "InvalidTtl": 
          // Check that the value used in time_to_live is an integer representing a duration in seconds between 0 and 2,419,200. 
          break; 
         case "DeviceMessageRateExceed": 
          // Reduce the number of messages sent to this device 
          break; 

        } 
       } 
      } 
     } 
    } 
}