关于GCM令牌更新过程感到困惑

7

我正在尝试实现谷歌最新的GCM服务。我已经阅读了GCM文档。我还下载并分析了谷歌的示例实现。从上面的所有内容中,我明白了以下内容:

  1. InstanceId服务提供API来生成gcm注册令牌,您将发送并存储此生成的令牌在您的应用服务器中。
  2. 这些令牌可以偶尔从客户端和InstanceId服务端更改,为了处理这个问题,您必须实现InstanceIDListenerService,并且InstanceId提供程序将调用onTokenRefresh,您只需编写逻辑以获取新令牌并将其发送到服务器(Google的示例应用程序)
  3. 有一种称为canonical_id(如此提到)的东西(即从设备发送的最后一个registration_id),如果您的应用服务器发送旧的registration_id,GCM服务器将向您的设备发送此ID。您必须使用此canonical_id替换服务器中现有的令牌。
现在,以下是我的问题:
  1. InstanceId.getToken 似乎会在应用程序未被卸载时返回相同的令牌,并且如果令牌没有更改,则返回非常快。因此,我每次启动应用程序时都可以调用 RegistrationIntentService 吗?这样我就可以保证始终使用最新的令牌。
  2. 如果您的应用程序在未连接到 Play 商店(无互联网或其他原因)时发生刷新,onTokenRefresh 会怎样?InstanceId 提供者会重试吗?这是否有记录在案?如果同时发送推送通知会发生什么?
  3. 什么是 canonical_id?它是为设备生成的最新令牌(由客户端的 InstanceID.getTokenInstanceId 提供者端启动)吗?如果 canonical_id 确实是最新的 GCM 令牌,那么如果您找到提供了 canonical_id,您还需要实现 onTokenRefresh 吗?
1个回答

4

我每次启动应用程序都可以调用RegistrationIntentService吗?

更好的解决方案是在首选项中保存您已经成功注册了令牌的信息。只有在您尚未注册时才会启动RegistrationIntentService。

String token = InstanceID.getToken(...);
//send to server
getSharedPreferences(context).edit().putBoolean(PREFIX_PREF_GCM_KEY, true).apply();

当你启动应用程序时,只需检查PREFIX_PREF_GCM_KEY是否为true。

如果您的应用程序未连接到Play商店(无互联网或其他原因),onTokenRefresh如何刷新?

我猜这取决于系统是否调用此refresh procedure。文档说明如下:

当系统确定需要刷新令牌时调用。应用程序应该调用getToken()并将令牌发送到所有应用程序服务器。这不会频繁调用,它是为了密钥轮换和处理特殊情况而需要的。系统将跨所有设备限制刷新事件,以避免向应用程序服务器发送令牌更新而导致超载。

它可以在您的应用程序处于睡眠状态时调用(与接收通知时相同),但您应该测试它并查看它是否按预期工作。

我还认为,您可以假定在没有互联网连接的情况下,System不会调用onRefreshToken,因为它无法接收更新通知...但是像往常一样,您应该自己测试以查看更新过程是否起作用及其条件。

canonical_id是什么?

有可能您错误地在您的服务器上为同一设备注册了多个注册ID - 例如 - onRefreshToken - 注册一个令牌而没有删除旧令牌。 如果您使用旧registartaion_id发送消息,谷歌将让您知道应该将其更改为新的canonical_id


谢谢!我知道你可以像我以前使用GCM API(GCM.register)一样在sharedpreferences中保存。然而,现在我对这个令牌更新感到困惑。我的基本问题是发送的canonical_id是否与该设备的最新令牌相同。因为如果是这种情况,就根本不需要实现onRefreshToken。 - ranjjose
1
为什么不呢?这是一个能够在问题出现之前解决问题的过程(在使用旧令牌之前更新令牌)。 - royB
1
如果您无法在服务器上更新新的刷新令牌,在您插入了新的刷新令牌但未删除旧令牌的情况下,简而言之,出现错误的情况下。 - royB
1
唯一可能的情况 - 这并不是真的,请阅读我的帖子和评论以及谷歌文档,你需要更新你的服务器以使用新的registration_id,所以有很多可能性导致你同时拥有registration_id和canonical_id。 - royB
1
我一直以为自己做得没问题 - 哈哈 (-; 如果翻译正确,请不要忘记接受答案或点赞,谢谢。 - royB
显示剩余3条评论

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