当前位置: 首页 > 知识库问答 >
问题:

Android GCM和多个令牌

楚乐逸
2023-03-14

我在谷歌CloudMessaging的GCM注册。getInstance(上下文);并将收到的令牌保存在设备上。然后将其发送到服务器,并将其与用户帐户关联。如果我卸载我的应用程序而不注销,然后再次安装并与其他用户登录,我将收到新令牌并将其发送到服务器。当推送被发送给第一个用户时,我会在和第二个用户登录时看到它们。

为什么GCM给我发送不同的令牌,我如何处理?

共有3个答案

沃弘图
2023-03-14

您可以将Android设备id与注册id一起发送。Android设备id是唯一的,在应用程序卸载和重新安装期间保持不变,只有在设备出厂重置时才会更改。

示例:如何在Android中获取唯一的设备硬件id?

梁俊智
2023-03-14

卸载应用程序时,我经历了注册ID更改,试图在卸载时向应用程序发送消息(直到我得到一个Not注册错误),然后再次安装。

谷歌的Costin Manolache建议通过以下方式处理注册ID变更:

建议/解决方法是生成您自己的随机标识符,例如保存为共享首选项。在每次应用程序升级中,您可以上载标识符和可能的新注册ID。这也可能有助于跟踪和调试服务器端的升级和注册更改。

当然,这仅在应用程序保持安装状态时有效(因为共享首选项会随应用程序一起删除)。但是,如果设备具有外部存储器,则可以将您的标识符存储在该存储器中,并且在再次安装应用程序时,从外部存储器加载存储的标识符。这样,您将知道新注册ID和旧注册ID属于同一设备。

此外,您应该在服务器中处理来自Google的规范注册ID响应,如另一个答案中所述。

孙和安
2023-03-14

欢迎来到来自谷歌云消息的重复消息的奇妙世界。发生这种情况时,GCM引擎将启用规范ID来解决此问题。这可能是因为您为同一设备注册了多个ID,或者是因为卸载应用程序时,GCM服务器未获得unregister()调用。使用规范ID会将您的ID设置为您进行的最后一次注册。

根据《GCM参考资料》,关于这一点:

规范ID

在服务器端,只要应用程序运行良好,一切都应该正常工作。然而,如果应用程序中的一个bug触发了同一设备的多个注册,则很难协调状态,最终可能会出现重复消息。

GCM提供了一种称为“规范注册标识”的工具,可以轻松地从这些情况中恢复。规范注册ID定义为应用程序请求的最后一次注册的ID。这是服务器向设备发送消息时应使用的ID。

如果稍后您尝试使用不同的注册ID发送消息,GCM将一如既往地处理该请求,但它将在响应的注册ID字段中包含规范注册ID。请确保使用此规范ID替换存储在服务器中的注册ID,因为您使用的ID最终将停止工作。

更多信息请点击这里。

此外,还有一个关于如何处理的实际案例,可能会有所帮助:

  • 规范注册ID和消息ID格式
 类似资料:
  • 本文描述了如何在同一个指令中实现多个选择器: https://www . benna del . com/blog/3367-matching-multiple-selectors-on-the-same-element-create-a-single-directive-instance-in-angular-5-0-0 . htm 但是当我定义或时,两者都是针对相同的指令。 能单独定义一下吗?

  • 问题内容: 我正在尝试构建自定义的tcserver docker映像。但是我在启动Web服务器和tomcat时遇到了一些问题。 据我了解,我应该使用ENTRYPOINT运行我想要的命令。 问题是,是否可以使用ENTRYPOINT运行多个命令? 还是应该创建一个小的bash脚本来全部启动? 基本上我想做的是: 但是我不知道这是否是一个好习惯,或者是否可行。 问题答案: 如果要在入口点运行许多命令,最

  • @Component({ selector: 'app-root', template: ` <div class="tabs-selection"> <tab *ngFor="let tab of tabs; let i = index" [active]="isSelected(i)" (click)="setTab(

  • 我成功地为1台服务器设置了Kerberos身份验证,并且运行正常。现在我有一个项目,我必须在其中向Kerberos配置添加另一台服务器,如下所示: 1)广告服务器 2)运行服务的服务器1 3) 服务器 2,其中将运行相同的服务 所以我执行了 setpn 命令,将两者都评估为单个“spn”用户: setspn-s服务X/server1.domain.com@DOMAIN.COM特殊目的网络 sets

  • 我正在尝试用docker容器中的一个表建立一个数据库。为了正确运行数据库,我需要运行以下命令: bash:--:无效选项db_1用法:bash[GNU long option][option]... db_1 bash[GNU long option][option]脚本-文件... db_1 GNU long options: db_1--debugg db_1--debugger\ 如果“ba

  • 问题内容: 我试图在一行中合并多个Linux命令以执行部署操作。例如 问题答案: 如果仅在上一个命令成功的情况下才执行每个命令,请使用运算符将它们组合: 如果其中一个命令失败,则将不执行其后的所有其他命令。 如果要执行所有命令而不管先前的命令是否失败,请使用分号将它们分开: 在您的情况下,我想您希望第一种情况下,下一条命令的执行取决于上一条命令的成功。 您还可以将所有命令放在脚本中,然后执行该脚本