GCM canonical id

前端 未结 4 1128
暖寄归人
暖寄归人 2020-12-01 21:14

When having multiple regids for 1 device GCM returns the canonical id error:

{\"multicast_id\":xxxx,\"success\":2,\"failure\":0,\"canonical_ids\":1,\"results         


        
相关标签:
4条回答
  • 2020-12-01 21:35
    <?php
    
    //ASSUME gcm_registration_table field
    // id || registration_id || user_id || created_at || updated_at
    
    
    // FIND CANONICAL IDS POSITION
    function CanonicalIdPosition($gcm_response)
    {
        $c_ids = array();
        foreach ($gcm_response['results'] as $k => $val) {
            if (isset($val['registration_id'])) {
                $c_ids[] = $k;
            }
        }
        if ($c_ids) {
            return $c_ids;
        } else {
            return false;
        }
    }
    
    // Find Duplicate registration Ids from Server Matchind to index position
    function DuplicateRegIdFromRegistrationTable($canonical_ids)
    {
    
        DB::query("SELECT registration_id FROM gcm_registration_table");
        $results = DB::fetch_assoc_all();
        $duplicate_reg_val = array();
    
    // Match Position and Find Value
        foreach ($results as $key => $val) {
            if (in_array($key, $canonical_ids)) {
                $duplicate_reg_val[] = $val['registration_id'];
            }
        }
    
        return $duplicate_reg_val;
    }
    
    // update existing Duplicate registration id with New Canonical registration ids
    function UpdateDuplicateRegIds($duplicateVal)
    {
    
        foreach ($duplicateVal as $val) {
            $sql = "UPDATE gcm_registration_table SET registration_id = {$val} WHERE registration_id ={$val}";
    // Some Yours Code...
        }
    }
    
    // Method to send Notification to GCM Server
    function SendGcmNotification($registatoin_ids_from_table, $message, $gcm_api_key, $dry_run = false)
    {
    
    // Set POST variables
        $url = 'https://android.googleapis.com/gcm/send';
    
        $fields = array(
            'registration_ids' => $registatoin_ids,
            'data' => $message,
            'dry_run' => $dry_run
        );
    
        $headers = array(
            'Authorization: key=' . $gcm_api_key,
            'Content-Type: application/json'
        );
    
    //print_r($headers);
    // Open connection
        if (!class_exists('curl_init')) {
            $ch = curl_init();
        } else {
            echo "Class Doesnot Exist";
            exit();
        }
    
    
    // Set the url, number of POST vars, POST data
        curl_setopt($ch, CURLOPT_URL, $url);
    
        curl_setopt($ch, CURLOPT_POST, true);
        curl_setopt($ch, CURLOPT_HTTPHEADER, $headers);
        curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
    
    // Disabling SSL Certificate support temporarly
        curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
    
        curl_setopt($ch, CURLOPT_POSTFIELDS, json_encode($fields));
    
    // Execute post
        $result = curl_exec($ch);
    
        if ($result === FALSE) {
    
            die('Curl failed: ' . curl_error($ch));
            return false;
        } else {
            return json_decode($result, true);
        }
    
    // Close connection
        curl_close($ch);
    }
    
    
    //This Wont Send Notification to Device but gives you response to remove canonical ids
    $gcm_response = SendGcmNotification($registatoin_ids_from_table, $message, $gcm_api_key, $dry_run = true);
    
    $canonical_ids = CanonicalIdPosition($gcm_response);
    
    if ($canonical_ids) {
        $duplicate_ids = DuplicateRegIdFromRegistrationTable($canonical_ids);
        UpdateDuplicateRegIds($duplicate_ids);
    }
    
    // Finally Get updated Registration Ids from table and send to GCM Server with
    $gcm_response = SendGcmNotification($registatoin_ids_from_table, $message, $gcm_api_key, $dry_run = false);
    
    0 讨论(0)
  • 2020-12-01 21:40

    The GCM response you included indicates that you sent a message to two Registration IDs. Both messages were received in the GCM service successfully. Only for the second message you got a canonical Registration ID.

    Since you get a response from Google for each request you send, you should know which Registration IDs were sent to Google in the request that triggered this response. The old Registration ID that you have to delete is the second Registration ID in that request.

    0 讨论(0)
  • 2020-12-01 21:50
    <?php
    
    // API access key from Google API's Console
    
    define( 'API_ACCESS_KEY', 'AIzaSyCa1vcyOF6UhM6cgvnwARBafmdl8haQo1Y' );
    $con=mysqli_connect("localhost","root","","bloodbank_master");
    $response = array();
    
    $q="SELECT `regester_id` FROM  `gcm`";
    $result1 = $con->query($q) ;
    if ($result1->num_rows > 0) {
    
    $response["users"] = array();
    
    while ($row = $result1->fetch_array(MYSQLI_BOTH)) {
        $user = array();
        $registrationIds = array($row[0]);
    
    
        $msg = array
        (
        'message'   => 'hieee',
        'title'     => 'Blood Bank',
        'subtitle'  => 'This is a subtitle. subtitle',
        'tickerText'    => 'Ticker text here...Ticker text here...Ticker text here',
        'vibrate'   => 1,
        'sound'     => 1,
        'largeIcon' => 'large_icon',
        'smallIcon' => 'small_icon'
        );
    
        $fields = array
        (
        'registration_ids'  => $registrationIds,
        'data'          => $msg
        );
    
        $headers = array
        (
        'Authorization: key=' . API_ACCESS_KEY,
        'Content-Type: application/json'
        );
    
        $ch = curl_init();
        curl_setopt( $ch,CURLOPT_URL, 'https://android.googleapis.com/gcm/send' );
        curl_setopt( $ch,CURLOPT_POST, true );
        curl_setopt( $ch,CURLOPT_HTTPHEADER, $headers );
        curl_setopt( $ch,CURLOPT_RETURNTRANSFER, true );
        curl_setopt( $ch,CURLOPT_SSL_VERIFYPEER, false );
        curl_setopt( $ch,CURLOPT_POSTFIELDS, json_encode( $fields ) );
        $result = curl_exec($ch );
        curl_close( $ch );
    
        echo $result;
        }
    } 
    else {
        $response["success"] = 0;
        $response["message"] = "No users found";
    }
    ?>
    
    0 讨论(0)
  • Eran's answer is correct, though I found it still a bit foggy for me. However, thanks to him I found a solution.

    Say this is your response:

    {
       "multicast_id":xxxxx,
       "success":7,
       "failure":0,
       "canonical_ids":2,
       "results":[
          {
             "message_id":"0:xxx%xxxxx"
          },
          {
             "message_id":"0:xxx%xxxxx"
          },
          {
             "registration_id":"MY_REG_ID_1",
             "message_id":"0:xxx%xxxxx"
          },
          {
             "message_id":"0:xxx%xxxxx"
          },
          {
             "message_id":"0:xxx%xxxxx"
          },
          {
             "registration_id":"MY_REG_ID_2",
             "message_id":"0:xxx%xxxxx"
          },
          {
             "message_id":"0:xxx%xxxxx"
          }
       ]
    }
    

    As you can see 2 of the 7 messages are a duplicate.

    This is the way I send messages to the server:

    $tokenResult = mysql_query("SELECT reg_ids FROM table_with_regids"); //
    $i = 0;
    while($row = mysql_fetch_array($tokenResult)) {
    
         $registrationIDs[$i] = $row['reg_ids'];
         $i++;
    }
    

    from Eran's answer:

    Since you get a response from Google for each request you send, you should know which Registration IDs were sent to Google in the request that triggered this response. The old Registration ID that you have to delete is the second Registration ID in that request.

    This means that index 2 and 5 of the array $registrationIDs[] should be replaced with MY_REG_ID_1 and MY_REG_ID_2.

    Finally check for double values and remove the exact duplicates. The result should be an array with 5 regids (or directly delete that index from your array instead of replacing with MY_REG_ID_#).

    0 讨论(0)
提交回复
热议问题