谷歌云消息注册 ID 过期

10
我正在为我的Android应用使用Google Cloud Messaging,并试图了解注册ID何时过期。从这篇文章中,我能够理解到Google倾向于在某个时间刷新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个回答

8
我正在尝试理解注册ID何时过期。
GCM服务器通常会刷新(因此您的旧注册ID已过期)注册ID。这个具体时间并没有记录在案。但当这种情况发生时,您将得到通知。
我们如何得到通知呢?
当您向一个已过期的注册ID发送通知时,第一次消息(通知)将会被传送,但是您将获得一个名为规范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)
}

非常感谢!那么规范的ID究竟放在哪里?它发送到Android设备吗?如果是,我该如何获取它? - RagHaven
不,你需要在服务器端获取它。当你使用Curl向“registration id”发送通知时,请从“curl_exec”获取响应并检查“canonical_ids”。 - Archie.bpgc
@RaghavShankar 我已经编辑了答案,添加了一些关于如何获取规范 ID 的代码。 - Archie.bpgc
实际上,你的代码只会给出需要被替换的id数量。如果你想要真正地替换它们,你应该解析JSON结果并查找包含"registration_id"的项,这将是更新值的键。如果你不想知道已替换registration_id值的用户数量,那么你的函数就是微不足道的。 - Abandoned Cart

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'];
}

0

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

当应用程序更新时,它应该使现有的注册ID失效,因为它不能保证与新版本兼容。由于在应用程序更新时没有调用生命周期方法,因此实现此验证的最佳方法是在存储注册ID时同时存储当前应用程序版本。


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

那么我需要每次检查注册ID并查看它是否已更改? - RagHaven
是的,那只是故障保护。 - Milan

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接