Google Cloud Messaging 注册 ID 过期

Posted

技术标签:

【中文标题】Google Cloud Messaging 注册 ID 过期【英文标题】:Google Cloud Messaging registration id expiration 【发布时间】:2013-08-13 03:25:45 【问题描述】:

我正在为我的 android 应用程序使用 Google Cloud Messaging,并试图了解注册 ID 何时到期。从this 的帖子中,我了解到谷歌有时会刷新 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;
 
?>

【问题讨论】:

【参考方案1】:

我正在尝试了解注册 ID 何时到期

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

我们如何收到通知?

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


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

就像我说的,它会第一次发送,即使在过期之后。


同样的帖子说,当应用程序时,id 会被刷新 版本变化

我不认为这肯定会发生。但即使它发生(注册 id 更改)它与上面解释的情况相同,所以您只需要注意 canonical 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 到底去哪里了呢?是发送到安卓设备吗?如果可以,如何获取? 不,你会在你的服务器端得到它。当您使用 Curl 将通知发送到 registration id 时。从curl_exec 获取响应并检查canonical_ids @RaghavShankar 我已经通过添加一些与如何获取规范 ID 相关的代码来编辑答案。 实际上,您的代码将简单地给出需要替换的 id 数量。如果您想实际替换它们,您应该解析 JSON 结果并查找包含“registration_id”的项目,这将是更新值的键。如果您不希望找出替换了 registration_id 值的用户数量,那么您的功能是微不足道的。【参考方案2】:

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

【讨论】:

所以我每次都要检查注册ID,看看有没有变化? 是的,这只是故障保险。【参考方案3】:

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

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

【讨论】:

【参考方案4】:

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

【讨论】:

以上是关于Google Cloud Messaging 注册 ID 过期的主要内容,如果未能解决你的问题,请参考以下文章

Google Cloud Messaging 设备未收到通知。 (没有“注册应用程序”链接)

Google Cloud Messaging 将在 7 天后过期

SERVICE_NOT_AVAILABLE 同时使用 Xamarin for Android 注册 Google Cloud Messaging

使用 Google Cloud Messaging 发送广播通知

Google Cloud Messaging API - 未经授权

Google Cloud Messaging - 有没有办法查看所有已发送(或排队)通知的列表?