我正在尝试实现谷歌最新的GCM
服务。我已经阅读了GCM文档。我还下载并分析了谷歌的示例实现。从上面的所有内容中,我明白了以下内容:
InstanceId
服务提供API来生成gcm注册令牌
,您将发送并存储此生成的令牌在您的应用服务器中。- 这些令牌可以偶尔从客户端和InstanceId服务端更改,为了处理这个问题,您必须实现
InstanceIDListenerService
,并且InstanceId提供程序将调用onTokenRefresh
,您只需编写逻辑以获取新令牌并将其发送到服务器(Google的示例应用程序) - 有一种称为
canonical_id
(如此提到)的东西(即从设备发送的最后一个registration_id),如果您的应用服务器发送旧的registration_id,GCM服务器将向您的设备发送此ID。您必须使用此canonical_id替换服务器中现有的令牌。
InstanceId.getToken
似乎会在应用程序未被卸载时返回相同的令牌,并且如果令牌没有更改,则返回非常快。因此,我每次启动应用程序时都可以调用RegistrationIntentService
吗?这样我就可以保证始终使用最新的令牌。- 如果您的应用程序在未连接到 Play 商店(无互联网或其他原因)时发生刷新,
onTokenRefresh
会怎样?InstanceId
提供者会重试吗?这是否有记录在案?如果同时发送推送通知会发生什么? - 什么是
canonical_id
?它是为设备生成的最新令牌(由客户端的InstanceID.getToken
或InstanceId
提供者端启动)吗?如果canonical_id
确实是最新的 GCM 令牌,那么如果您找到提供了canonical_id
,您还需要实现onTokenRefresh
吗?
GCM.register
)一样在sharedpreferences
中保存。然而,现在我对这个令牌更新感到困惑。我的基本问题是发送的canonical_id是否与该设备的最新令牌相同。因为如果是这种情况,就根本不需要实现onRefreshToken。 - ranjjose