9

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

同一篇文章还说,当应用程序版本更改时,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;
 
?>
4

4 回答 4

8

我试图了解注册 ID 何时到期

GCM 服务器通常会刷新(因此您的旧注册 ID 已过期)注册 ID。何时发生这种情况并没有在任何地方记录。但是当发生这种情况时,您会收到通知。

我们如何得到通知?

当您向已过期的注册 id 发送通知时,将第一次发送消息(通知),但您将获得一个名为 canonical id 的新注册 id这意味着,您向其发送消息的注册 id 已更改为此规范 id,因此请在您的服务器端也进行更改


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

就像我说的,它将第一次发送,即使在过期之后也是如此。


同一篇文章还说,当应用程序版本更改时,id 会刷新

我不认为这肯定会发生。但即使它发生(注册 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)
}
于 2013-08-13T06:23:38.660 回答
0

我不确定 GCM regId 何时刷新,但GCM 客户端文档指出“检查应用程序是否已更新;如果是,则必须清除注册 ID,因为不能保证现有 regID 可与新应用程序版本一起使用。” 所以是的,它可能仍在使用旧的 regId,但是不能保证它不会有新的 regId。

于 2013-08-13T03:43:11.320 回答
0

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

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

于 2014-12-29T12:36:47.163 回答
0

获取最新的 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

所以,现在系统会在新的 Gcm Id 改变时自动更新它。

更新 :

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

$GCMIDChanged = $result['canonical_ids'];
if($GCMIDChanged)
{
    $NewGCMIdList = end($result['results']);
    $NewGCMId =  $NewGCMIdList['registration_id'];
}
于 2015-06-08T08:46:03.597 回答