对 GCM 令牌更新过程感到困惑
Confused about GCM Token updation process
正在尝试实施 google 的最新 GCM
服务。我已阅读 GCM documentation. I have also downloaded & analysed google's sample implementation。从以上所有我理解了以下内容:
InstanceId
服务提供 API 来生成 gcm registration tokens
您将生成的令牌发送并存储在您的应用服务器中。
- 这些令牌可以从客户端和 instanceId 服务端偶尔更改一次,如前所述 here. To handle this, you have to implement
InstanceIDListenerService
and the InstanceID provider will call onTokenRefresh
where you just write your logic to get a new token and sending it to server (Google's sample app )
- 如果您的应用服务器发送了较旧的注册 ID,GCM 服务器会向您的设备发送名为
canonical_id
(as mentioned here) 的东西(这是从设备发送的最后一个 registration_id) .您必须用此 canonical_id. 替换服务器中现有的令牌
现在,以下是我的问题:
如果未卸载应用程序,InstanceId.getToken
似乎 return 相同的令牌,如果令牌未更改,它 return 非常快。那么,我可以在每次启动应用程序时调用 RegistrationIntentService
吗?这样我就可以保证始终使用最新的令牌。
- 当您的应用未连接到 Play 商店(没有互联网或其他东西)时,
onTokenRefresh
if 刷新如何发生? InstanceId
供应商是否重试?这在某处记录了吗?如果同时发送推送通知会怎样?
canonical_id
到底是什么?它是为设备生成的最新令牌(由 InstanceID.getToken
在客户端或 InstanceId
提供商端启动)吗?如果 canonical_id
确实是最新的 gcm 令牌,那么 onTokenRefresh
实施的必要性是什么,因为如果您发现提供了 canonical_id
,您无论如何都可以分析推送通知数据并更新您的应用程序服务器?
can I call the RegistrationIntentService every time I start the app?
更好的解决方案是优先保存您已经成功注册令牌的信息。仅当您尚未注册时才开始 RegistrationIntentService
。
String token = InstanceID.getToken(...);
//send to server
getSharedPreferences(context).edit().putBoolean(PREFIX_PREF_GCM_KEY, true).apply();
然后当您启动您的应用程序时,只需检查 PREFIX_PREF_GCM_KEY
是否为真
How does the onTokenRefresh if refresh happens while your app is not connected to the play store (no internet or something)
我猜这取决于系统调用 refresh procedure
。文件指出:
Called when the system determines that the tokens need to be refreshed. The application should call getToken() and send the tokens to all application servers.
This will not be called very frequently, it is needed for key rotation and to handle special cases.
The system will throttle the refresh event across all devices to avoid overloading application servers with token updates.
它可以在您的应用休眠时调用(与您收到通知时相同),但您应该对其进行测试,看看它是否按预期工作。
我还认为您可以假设当没有互联网连接时,System
不会调用 onRefreshToken
,原因很简单,它无法接收更新通知。 .. 但一如既往,您应该自行测试更新过程是否有效以及在何种条件下有效。
What exactly is a canonical_id?
您可能错误地在您的 服务器中为同一设备注册了多个注册 ID - 例如 - onRefreshToken
- 注册了一个令牌但没有删除旧的一。
如果您将使用旧的 registartaion_id
发送消息,google 将让您知道您应该将其更改为新的 - canonical_id
正在尝试实施 google 的最新 GCM
服务。我已阅读 GCM documentation. I have also downloaded & analysed google's sample implementation。从以上所有我理解了以下内容:
InstanceId
服务提供 API 来生成gcm registration tokens
您将生成的令牌发送并存储在您的应用服务器中。- 这些令牌可以从客户端和 instanceId 服务端偶尔更改一次,如前所述 here. To handle this, you have to implement
InstanceIDListenerService
and the InstanceID provider will callonTokenRefresh
where you just write your logic to get a new token and sending it to server (Google's sample app ) - 如果您的应用服务器发送了较旧的注册 ID,GCM 服务器会向您的设备发送名为
canonical_id
(as mentioned here) 的东西(这是从设备发送的最后一个 registration_id) .您必须用此 canonical_id. 替换服务器中现有的令牌
现在,以下是我的问题:
-
如果未卸载应用程序,
InstanceId.getToken
似乎 return 相同的令牌,如果令牌未更改,它 return 非常快。那么,我可以在每次启动应用程序时调用RegistrationIntentService
吗?这样我就可以保证始终使用最新的令牌。- 当您的应用未连接到 Play 商店(没有互联网或其他东西)时,
onTokenRefresh
if 刷新如何发生?InstanceId
供应商是否重试?这在某处记录了吗?如果同时发送推送通知会怎样? canonical_id
到底是什么?它是为设备生成的最新令牌(由InstanceID.getToken
在客户端或InstanceId
提供商端启动)吗?如果canonical_id
确实是最新的 gcm 令牌,那么onTokenRefresh
实施的必要性是什么,因为如果您发现提供了canonical_id
,您无论如何都可以分析推送通知数据并更新您的应用程序服务器?
can I call the RegistrationIntentService every time I start the app?
更好的解决方案是优先保存您已经成功注册令牌的信息。仅当您尚未注册时才开始 RegistrationIntentService
。
String token = InstanceID.getToken(...);
//send to server
getSharedPreferences(context).edit().putBoolean(PREFIX_PREF_GCM_KEY, true).apply();
然后当您启动您的应用程序时,只需检查 PREFIX_PREF_GCM_KEY
是否为真
How does the onTokenRefresh if refresh happens while your app is not connected to the play store (no internet or something)
我猜这取决于系统调用 refresh procedure
。文件指出:
Called when the system determines that the tokens need to be refreshed. The application should call getToken() and send the tokens to all application servers. This will not be called very frequently, it is needed for key rotation and to handle special cases. The system will throttle the refresh event across all devices to avoid overloading application servers with token updates.
它可以在您的应用休眠时调用(与您收到通知时相同),但您应该对其进行测试,看看它是否按预期工作。
我还认为您可以假设当没有互联网连接时,System
不会调用 onRefreshToken
,原因很简单,它无法接收更新通知。 .. 但一如既往,您应该自行测试更新过程是否有效以及在何种条件下有效。
What exactly is a canonical_id?
您可能错误地在您的 服务器中为同一设备注册了多个注册 ID - 例如 - onRefreshToken
- 注册了一个令牌但没有删除旧的一。
如果您将使用旧的 registartaion_id
发送消息,google 将让您知道您应该将其更改为新的 - canonical_id