无需登录即可安装应用程序时的 GCM 和规范 ID

Posted

技术标签:

【中文标题】无需登录即可安装应用程序时的 GCM 和规范 ID【英文标题】:GCM and canonical Ids when reinstalling the app witouth logout 【发布时间】:2015-04-03 11:38:52 【问题描述】:

我已经在我的 android 应用中实现了推送通知。

现在,我遇到了著名的规范 id 问题。 如果我在没有注销的情况下卸载应用程序,因此没有从我的数据库中删除device_ids,当我重新安装应用程序时,我会收到不适合新用户的通知。

Google 建议使用规范 id 来解决这个问题,但我不明白我必须在哪里拦截它并更改我的数据库中的 id。 我有这个发送通知的 php 页面:

    $gcm=new GCM();
    //get the array of all id associated to the user
    $row= (query to get registration_ids from my database);
    while($row = mysql_fetch_assoc($result))
        array_push($registration_ids, $row['id_device']);
    
    //create a message to send
    $mymessage="my message"; 
    $message=array("message"=>$mymessage);
    //send the notification and take the result
    $result_android=$gcm->send_notification($registration_ids,$message);
    echo $result_android;


   //class that send the notification
   class GCM
   function __construct()
    public function send_notification($registatoin_ids,$message)
    // GOOGLE API KEY
    define("GOOGLE_API_KEY","xxxxxxxxxxxxxxxxx");
    $url="https://android.googleapis.com/gcm/send";
    $fields=array(
        "registration_ids"=>$registatoin_ids,
        "data"=>$message,
    );
    var_dump($fields);
    $headers=array(
        "Authorization: key=".GOOGLE_API_KEY,
        "Content-Type: application/json"
    );
    $ch=curl_init();
    curl_setopt($ch,CURLOPT_URL,$url);
    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);
    if($result===FALSE)
        die("Curl failed: ".curl_error($ch));
    
    curl_close($ch);
    echo $result;

我应该在哪里获取canonical_ids 并将其插入到我的数据库中?服务器端还是客户端?我很困惑。

【问题讨论】:

在你的代码中加入一些 cmets 可以帮助其他人回答你的问题。使标题更像问题也会有所帮助。 对不起,我已经编辑了我的问题 查看 SO 帖子的答案,可能与您要查找的内容相关,此处包含大量信息。 ***.com/questions/27072824/…希望有帮助!! 感谢您的信息。然后我必须在服务器端获取规范 ID 并覆盖我在数据库中发出请求的旧 reg id?但是这样客户端总是最后一次收到一个错误的请求,对吗? 【参考方案1】:

现在,当我向具有多个注册 ID 的设备发送推送通知时,发送请求的 php 页面的结果是这样的:

array(2)  ["registration_ids"]=> array(1)  [0]=> string(162) "XXXXXX(old reg id)XXXXXXX"  ["data"]=> array(1)  ["price"]=> string(24) "Hi, I’m a push notification!"  
"multicast_id":7004172909649400096,"success":1,"failure":0,"canonical_ids":1,"results":["registration_id":" XXXXXX(canonical reg id)XXXXXXX ","message_id":"0:1428420202799897%73660ba9f9fd7ecd"]

我应该怎么做才能不发送错误的通知?

【讨论】:

【参考方案2】:

您需要阅读此工作Example 来解决您的问题。基本上我们必须用现有的重复注册 id 更新规范 id。作为对 GCM 通知的响应,有一件事是相似的,即数组的位置有助于使用现有注册 id 更新规范 id 以避免重复消息。

【讨论】:

以上是关于无需登录即可安装应用程序时的 GCM 和规范 ID的主要内容,如果未能解决你的问题,请参考以下文章

gcm注册id的持久化

Android - 如何为 GCM 实施规范 ID 以防止重复

应用安装时的 android GCM 注册

规范注册 id gcm

GCM,注册 ID 和处理用户登录/注销

关于 GCM 中的规范 ID(谷歌云消息传递)