困惑于GCM令牌更新过程

试图实施谷歌最新的GCM服务。 我已阅读GCM文档。 我也下载并分析了谷歌的示例实现。 从以上所有我了解以下内容:

  • InstanceId服务提供API来生成gcm registration tokens您将生成的令牌发送并存储在您的应用服务器中。
  • 这些令牌可以在客户端以及instanceId服务端稍后更改一次,如此处所述。 为了处理这个问题,你必须实现InstanceIDListenerService ,InstanceID提供者将调用onTokenRefresh ,你只需写你的逻辑来获得一个新的令牌并将它发送给服务器(Google的示例应用程序)
  • 如果您的应用服务器发送较早的注册ID,则会有一个名为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

    链接地址: http://www.djcxy.com/p/87587.html

    上一篇: Confused about GCM Token updation process

    下一篇: "Trait Not Registered" Error