困惑于GCM令牌更新过程
试图实施谷歌最新的GCM
服务。 我已阅读GCM文档。 我也下载并分析了谷歌的示例实现。 从以上所有我了解以下内容:
InstanceId
服务提供API来生成gcm registration tokens
您将生成的令牌发送并存储在您的应用服务器中。 InstanceIDListenerService
,InstanceID提供者将调用onTokenRefresh
,你只需写你的逻辑来获得一个新的令牌并将它发送给服务器(Google的示例应用程序) canonical_id
(如此处所述)(这是设备发送的最后一个registration_id)GCM服务器发送您的设备。 您必须使用此canonical_id替换服务器中的现有令牌。 现在,以下是我的问题:
InstanceId.getToken
似乎会返回相同的标记,并且如果标记未更改,它将返回相当快。 那么,我每次启动应用程序时都可以调用RegistrationIntentService
? 这样我就可以保证始终使用最新的令牌。 onTokenRefresh
如果在您的应用没有连接到Play商店(没有互联网或其他东西)的情况下发生刷新,那么该怎么办? InstanceId
提供程序是否重试? 这是记录在某处吗? 如果同时发送推送通知会发生什么? canonical_id
? 它是一个设备(由发起生成的最新令牌InstanceID.getToken
在客户端或在InstanceId
提供商端)? 如果canonical_id
确实是最新的gcm令牌,那么您可以如何分析推送通知数据并更新您的应用服务器(如果您找到canonical_id
,那么对onTokenRefresh
实现的需求是什么? 我每次启动应用程序时都可以调用RegistrationIntentService?
更好的解决方案是优先保存你已经设法注册一个令牌。 只有在您尚未RegistrationIntentService
才启动RegistrationIntentService
。
String token = InstanceID.getToken(...);
//send to server
getSharedPreferences(context).edit().putBoolean(PREFIX_PREF_GCM_KEY, true).apply();
那么当你启动你的应用程序时,只需检查PREFIX_PREF_GCM_KEY
是否为真
onTokenRefresh如果在您的应用没有连接到Play商店时发生刷新(没有互联网或其他东西)
我猜测这是由系统来调用这个refresh procedure
。 该文件指出:
当系统确定令牌需要刷新时调用。 应用程序应调用getToken()并将令牌发送给所有应用程序服务器。 这不会被称为非常频繁,它需要密钥轮换和处理特殊情况。 系统将限制所有设备的刷新事件,以避免使用令牌更新过载应用程序服务器。
它可以在您的应用程序睡着时调用(与获取通知时相同),但您应该测试它并查看它是否按预期工作。
我也认为你可以假设,虽然没有互联网连接,但System
不会调用onRefreshToken
,原因很简单,它将无法接收更新通知...但是,一如你总是应该自己测试一下,看看是否更新过程起作用并且在哪些条件下。
什么是canonical_id?
有可能是因为你错误地注册了多个注册ID给你的服务器上的同一个设备 - 例如 - onRefreshToken
- 注册了一个令牌而不删除旧的。 如果您将使用旧的registartaion_id
发送消息,Google会让您知道您应该将其更改为新的 - canonical_id