Google云消息传递注册ID过期

我为我的Android应用程序使用Google Cloud Messaging,并试图了解注册ID何时到期。 从这篇文章中,我明白Google有时会刷新ID。 我很好奇我的应用程序将知道什么时候id被刷新? 如果Google决定刷新这个ID,我的服务器直到将这个消息发送到旧ID,我不认为这个消息会被发送。 所以我必须每次都尝试注册,看看id是否相同?

同样的post说,应用程序版本发生变化时id会刷新,但通过清单更改版本的注册ID不会改变。 那么试图再次注册版本更改有什么意义呢?

编辑这里是服务器端。 在哪里存储规范的id?

服务器端代码:

<?php // Message to be sent $message = $_POST['message'];  // Set POST variables $url = 'https://android.googleapis.com/gcm/send';  $fields = array(                 'registration_ids' => array($_POST['registrationIDs']),                 'data'             => array( "message" => $message ),                 );  $headers = array(                     'Authorization: key=' . $_POST['apiKey'],                     'Content-Type: application/json'                 );  // Open connection $ch = curl_init();  // 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 );  curl_setopt( $ch, CURLOPT_POSTFIELDS, json_encode( $fields ) );  // Execute post $result = curl_exec($ch);  // Close connection curl_close($ch);  echo $result;  ?> 

  • 在启动GCM程序之前,如何检查用户是否已经在设备上添加了Google帐户?
  • GCM错误= MissingRegistration通过JSON发送消息
  • 注册ID无理由变为“未注册”
  • 使用GCM将推送通知发送到多个Android设备
  • 什么是授权实体? 在自己的应用程序中找不到gcm_defaultSenderId
  • Android GCM(推送通知):设备在应用程序停止时不会收到通知
  • 每次应用程序启动时都请求Google Cloud Messaging(GCM)注册ID
  • GCM:MulticastResult - 结果来自哪个设备?
  • 我想了解注册ID何时到期

    GCM服务器通常刷新(所以您的旧注册ID已过期)注册ID。 什么时候发生这种情况都没有logging在任 但是,如果发生这种情况,您会收到通知

    我们如何通知?

    当您发送通知给过期的注册ID时,第一次将会发送消息(通知),但是您将得到一个新的注册ID,其名称为canonical id这意味着,您发送消息的注册ID已被更改为此规范ID,所以请在您的服务器端更改它


    如果Google决定刷新这个ID,我的服务器直到将这个消息发送到旧ID,我不认为这个消息会被发送

    就像我说的那样,即使到期后也会第一次发送。


    同样的post也说这个id会在应用版本发生变化时刷新

    我不认为这确实发生。 但是,即使发生了(注册ID变化),它也与上面解释的情况相同,所以您只需要注意规范标识

    编辑

     $result = curl_exec($ch); $result = json_decode($result); $canonical_ids_count = $result->canonical_ids; if($canonical_ids_count){ //update your DB by replacing the registration id with //the canonical id(new registration id) } 

    GCM客户端文档指出:“检查应用程序是否已更新;如果是,则必须清除注册ID,因为现有的REGID不能保证与新的应用程序版本一起工作。 所以是的,它可能仍然使用旧的REGID,但不保证它不会有一个新的REGID。

    根据http://developer.android.com/google/gcm/client.html#sample-register ,与以前版本的GCM和C2DM不同,Google本身不刷新注册。 一旦你从初始注册中获得了注册ID,除了一种情况之外,你还是很好的:当用户升级到一个新的版本时,你仍然需要重新注册(这个例子也在上面的链接的例子中处理)。

    当应用程序更新时,它应该使其现有的注册ID无效,因为它不能保证与新版本一起工作。 由于应用程序更新时没有调用生命周期方法,因此实现此validation的最佳方法是在存储注册标识时存储当前的应用程序版本。

    获取最新的GCM ID这里是我的工作。

     $result = curl_exec($ch); $result = json_decode($result, true); $GCMIDChanged = $result['canonical_ids']; if($GCMIDChanged) { $NewGCMId = $result['results'][0]['registration_id']; //Update your DB with $NewGCMId } 

    在上面的代码中,我正在检查结果中是否存在canonical_ids

    如果canonical_ids存在,那么我得到新的registration_id

    所以,现在系统会自动更新New Gcm Id。

    更新:

    如果GCM ID多次更改,则可以使用以下代码

     $GCMIDChanged = $result['canonical_ids']; if($GCMIDChanged) { $NewGCMIdList = end($result['results']); $NewGCMId = $NewGCMIdList['registration_id']; }