1

Android 开发网站上 GCM 示例中的客户端代码默认为gcm.register(SENDER_ID);每 7 天后调用一次,方法是使用以下函数检查注册是否过期:

public static final long REGISTRATION_EXPIRY_TIME_MS = 1000 * 3600 * 24 * 7;

/**
 * Checks if the registration has expired.
 *
 * To avoid the scenario where the device sends the registration to the
 * server but the server loses it, the app developer may choose to re-register
 * after REGISTRATION_EXPIRY_TIME_MS.
 *
 * @return true if the registration has expired.
 */
private boolean isRegistrationExpired() {
    final SharedPreferences prefs = getGCMPreferences(context);
    // checks if the information is not stale
    long expirationTime =
            prefs.getLong(PROPERTY_ON_SERVER_EXPIRATION_TIME, -1);
    return System.currentTimeMillis() > expirationTime;
}

该函数上面的注释暗示这是为了“避免设备向服务器发送注册但服务器丢失它的情况。这是否暗示我们的服务器(不是GCM服务器)可能会丢失注册id?或者是这是因为注册 ID 在 GCM 方面可能会变得无效吗?根据GCM 高级主题页面中的以下段落,这似乎是可能的:

同样,备份应用程序时不应保存注册 ID。这是因为注册 ID 可能在应用程序恢复时失效,这会使应用程序处于无效状态(即应用程序认为它已注册,但服务器和 CM 不再存储该注册 ID —因此应用程序不会收到更多消息)。

先感谢您!

4

2 回答 2

4
  1. 你说:

    该函数上面的注释暗示这是为了“避免设备向服务器发送注册但服务器丢失它的情况。这是否暗示我们的服务器(不是GCM服务器)可能会丢失注册id?或者是这是因为注册 ID 在 GCM 方面可能会变得无效?

    我认为他们在谈论我们的服务器(第 3 方服务器)而不是 GCM 服务器。第二点会更清楚一点。

  2. 另外,您提到文档说:

    备份应用程序时不应保存注册 ID。这是因为注册 ID 在应用程序恢复时可能会失效,这会使应用程序处于无效状态。

    我想如果您仔细阅读架构概述页面上启用 GCM标题下的第二点 ,它会说:

    请注意,Google 可能会定期刷新注册 ID,因此您应该在设计您的 Android 应用程序时理解com.google.android.c2dm.intent.REGISTRATION意图可能会被多次调用。您的 Android 应用程序需要能够做出相应的响应。

    因此,Google 可能会定期刷新他的注册 ID。这就是为什么在应用程序恢复时注册 ID 可能会失效。

    因此,为了处理这一点,您应该有一个可以处理com.google.android.c2dm.intent.REGISTRATION意图的广播侦听器,当 Google 必须刷新注册 ID 时,它会发送给应用程序。

    这也可能清楚第一点。由于本案例处理的是来自 Google 端的 ID 刷新,本地 7 天有效期将处理在第 3 部分服务器上丢失 ID 的另一种情况(因为它每 7 天后定期刷新)。

这是我对你的问题的看法。希望这可以帮助。

于 2013-07-26T23:15:36.393 回答
3

澄清“备份/恢复”案例:注册 ID 与特定设备相关联。如果应用程序在不同的设备上恢复 - 以前的注册 ID 仍然指向旧设备,在恢复的设备上获取消息的唯一方法是获取新的注册 ID。

于 2013-07-27T16:28:39.943 回答