即使卸载后,旧的 GCM 令牌还会继续存在吗?

2024-05-01

我们一直致力于 GCM 实现,并注意到分配给应用程序安装的设备地址即使卸载应用程序也可以继续存在。

因此,我们安装一个应用程序,获取令牌 A,设备订阅特定警报类型 1、消息令牌 A 并取得巨大成功。然后我们卸载该应用程序。

不,我们重新安装,接收令牌 B,并且设备订阅特定警报类型 2,我们成功地向令牌 B 发送消息。

现在,由于我们在卸载和重新安装应用程序之间没有向令牌 A 发送消息,因此我们仍然可以向这两个令牌发送消息,并且应用程序会收到它们。

如果我们在应用程序卸载时尝试向令牌 A 发送消息,我们就可以从 Google 的响应中清除该消息。

有什么方法可以知道代币 A 在技术上不再有效吗?


来自官方文档:

卸载客户端应用程序注册的工作原理 https://developers.google.com/cloud-messaging/registration#how-uninstalled-client-app-unregistration-works

客户端应用程序可以在注册后自动注销 已卸载。然而,这个过程不会立即发生。什么 这种情况下发生的情况是:

  1. 最终用户卸载客户端应用程序。
  2. 应用程序服务器向 GCM 连接服务器发送消息。
  3. GCM 连接服务器将消息发送到设备上的 GCM 客户端。
  4. 设备上的GCM客户端收到消息,检测到客户端应用已被卸载;检测详细信息取决于客户端应用程序运行的平台。
  5. 设备上的GCM客户端通知GCM连接 客户端应用程序已卸载的服务器。
  6. GCM 连接服务器 标记要删除的注册令牌。
  7. 应用服务器发送一个 向 GCM 发送消息。
  8. GCM 返回 NotRegistered 错误消息给 应用程序服务器。
  9. 应用服务器应删除注册令牌。

笔记 注册令牌可能需要一段时间才能完全完成 从 GCM 中删除。因此,在步骤 7 中发送的消息有可能 上面获取一个有效的消息 ID 作为响应,即使该消息 不会传递到客户端应用程序。最终,登记 令牌将被删除,服务器将收到 NotRegistered 错误, 无需应用程序服务器执行任何进一步操作。

但是,显然您仍然会收到旧注册 ID 的通知,正如用户在其他问题中所述:

  • 重新安装后,应用程序使用 GCM 收到重复的通知 https://stackoverflow.com/questions/27315169/app-recieves-duplicate-notification-using-gcm-after-reinstalling
  • Android GCM 和多个令牌 https://stackoverflow.com/questions/23293444/android-gcm-and-multiple-tokens
  • https://stackoverflow.com/questions/27845298/gcm-deleting-app-and-reinstalling-multiple-notifications https://stackoverflow.com/questions/27845298/gcm-deleting-app-and-reinstalling-multiple-notifications
  • 取消注册和重新注册 GCM 消息会导致两个 regId 有效。这是如预期的那样吗? https://stackoverflow.com/questions/16320549/unregistering-and-re-registering-for-gcm-messages-causes-two-regids-to-be-valid

对于这个问题,有一个称为“规范 ID”的功能:

规范ID https://developers.google.com/cloud-messaging/registration#canonical-ids

如果客户端应用程序中的错误触发了多次注册 同一设备,很难协调状态和客户端应用程序 可能最终会出现重复的消息。

实施规范 ID 可以帮助您更轻松地从这些问题中恢复 情况。规范的注册 ID 是注册令牌 客户端应用程序请求的最后一次注册。这是身份证 服务器向设备发送消息时应使用的。

如果您尝试使用旧的注册令牌发送消息,GCM 将 照常处理请求,但它将包含规范 ID 响应的 Registration_id 字段。确保更换 使用此规范 ID 存储在您的服务器中的注册令牌,如 最终旧的注册令牌将停止工作。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

即使卸载后,旧的 GCM 令牌还会继续存在吗? 的相关文章

  • 处理 Android 锁屏上的音量变化?

    我想做的是 能够在 android 4 4 上的锁屏上捕获音量增大 减小按钮操作 Google Cast 设计清单 https developers google com cast docs design checklist sender
  • Android Manifest 自动生成无效权限

    我不小心在 Android 清单中输入了无效的权限名称 并且无法将其删除 这是我的清单代码
  • 添加动态数据时 footable 出现问题

    我需要 jQuery Mobile 方面的一些帮助富表 http css tricks com footable a jquery plugin for responsive data tables 我正在表中动态添加数据 HTML tab
  • 导航组件参数默认值

    在导航组件中 将参数从第一个片段发送到第二个片段时 默认值不会从导航图中获取哪个集合 这是我的代码 导航图 xml
  • 维护 HttpUrlConnection 调用之间的会话(Native/Webview)

    让我从我做的开始desire 我想制作一个应用程序part native and part webviews Problem 维护本机和 webview 部分之间的会话 My 处理方法 this 我打算实现一个本机登录 其中我向用户展示两个
  • 从 BroadcastReceiver 获取方法来更新 UI

    我正在尝试根据变量的变化更新用户界面BroadcastReceiver 因此 我需要调用一个扩展类的方法 以获取我提到的变量 BroadcastReceiver in MainActivity取决于但我无法以任何方式获得真正的返回值 扩展的
  • ListView:防止视图回收

    我有一个使用回收视图的 ListView 我试图阻止视图被回收 所以我使用 setHasTransientState android support v4 view ViewCompatJB setHasTransientState Vie
  • 如何忽略 LeakCanary 中的某些类?

    有人能给我一个如何忽略 LeakCanary 中的某些类的有效示例吗 我正在查看这个示例 以忽略 LeakCanary 中第三方库中的某些类 但我不知道将其放在应用程序中的何处 我把它放在我的应用程序类中 但这些变量和方法有错误 isInA
  • Android 谷歌地图 V2 已停止

    我正在尝试构建地图应用程序并关注这个链接 https blog emildesign rhcloud com p 435一步步 我在这里找到了类似的主题 但对我没有帮助 我想显示地图 但是当我运行它时 它返回强制关闭和我的 Android
  • android:进程和进程名称

    我试图理解android process属性 Ref says http developer android com guide topics manifest application element html proc 如果分配给该属性的
  • 在 Android 中始终以横向模式打开相机

    在我的 Android 应用程序中 单击按钮后我希望相机以横向模式打开 即使我将手机旋转为纵向模式 相机也应始终处于横向模式或纵向模式 使用此代码在横向模式下打开相机 Intent cameraIntent new Intent Media
  • 使用 RxJava 限制吞吐量

    我现在遇到的情况很难解释 所以我会写一个更简单的版本来解释这个问题 我有一个Observable from 它发出一系列由ArrayList文件数量 所有这些文件都应上传到服务器 为此 我有一个函数可以完成这项工作并返回一个Observab
  • Android:BATTERY_STATUS_DISCHARGING 和 BATTERY_STATUS_NOT_CHARGING 之间的区别

    我想知道这两个标志之间的区别 BatteryManager BATTERY STATUS DISCHARGING And BatteryManager BATTERY STATUS NOT CHARGING 我开发了一个使用这两个标志的应用
  • Android - 多次实例化一个片段?

    我正在创建一个在 ListView 中显示数据的应用程序 数据分为两种类型 热门 收藏夹 我有一个活动和两个片段 片段根据类别显示项目列表 我为此使用了 ListView 然后我有两个fragment layouts 它们在设计上完全相同
  • 使用 UPI url 调用 PSP 应用程序

    我正在尝试创建一个商家应用程序 它将根据 NPCI 的指南生成一个 url 此 url 将作为意图共享 并且 PSP 应用程序 任何注册的银行应用程序 应该能够侦听该 url 并被调用 我已经形成了这样的网址 upi pay pa icic
  • 在 android 版本 7.0 上膨胀类 android.widget.DatePicker 时出错

    我想显示弹出日期选择器并且我使用此代码 Calendar mcurrentDate Calendar getInstance int mYear mcurrentDate get Calendar YEAR int mMonth mcurr
  • Android 4.2 - Environment.getExternalStorageDirectory().getPath() 行为

    我一直在开发一个android应用程序 在上次更新到4 2之前 我使用 Environment getExternalStorageDirectory getPath 它返回了我 storage sdcard0 但自从更新后我现在得到了 s
  • 如何通过 AppCompatActivity 使用 YouTube Android 播放器 API

    为了在我的应用程序中播放视频 我决定扩展 YouTube Android Player API 但问题是我的菜单消失了 因为我没有从 AppCompatActivity 扩展 问题是 如何使用 YouTube Android Player
  • 制作弹跳动画

    我想做图层的弹跳动画 我已经完成了该图层从右到中心的操作 现在我想将其向后移动一点 然后回到中心 这会产生反弹效果 我想我可以用这样的翻译来做到这一点
  • 查询联系人 - 有时返回空游标

    我正在尝试查询联系人的显示名称 Override public void onActivityResult int requestCode int resultCode Intent data switch requestCode case

随机推荐

  • Jquery UI 滑块 - 输入值并将滑块移动到位置

    我想知道是否有人找到了实际填充滑块的输入框并使其滑动到适当位置 onBlur 的解决方案或示例 目前 众所周知 它只是用您所在的位置更新此值在 因此 在某些方面 我试图扭转这个令人惊叹的滑块的功能 我找到的一个链接 http www web
  • 如何使 Angularjs 应用程序可抓取

    我使用 Angular js 构建单页应用程序 我的问题是如何使应用程序可爬行 因为路由是在客户端使用 ng view 处理的 而服务器只返回简单的头文件 网站链接 http india elections in http india el
  • 如何更新 Android 上的 Google Analytics 清单?

    我正在尝试禁用 Google Firebase Analytics 的自动屏 幕报告 在里面Firebase 博客文章 https firebase googleblog com 2020 08 google analytics manua
  • 制作波浪动画

    我正在尝试制作音频波动画 这段代码有什么问题 我尝试将翻译更改为比例 但没有成功 有人可以给我一些动画练习的链接吗 webkit box sizing border box box sizing border box webkit pers
  • 调用过程默认值而不将值绑定到 Jdbc 中的参数

    我正在尝试打电话PL SQL为其某些参数定义了默认值的过程 我正在这样做使用CallableStatement in JDBC 该过程有大量已定义默认值的参数 我不想在 Java 代码中显式设置默认值 这样做会使维护代码变得更加困难 如果
  • 当需要切换rootViewController时

    我一直在开发一个 Swift 项目 我有两个视图控制器 登录视图控制器和主页视图控制器 当用户启动应用程序时 如果用户未登录 我想显示登录视图控制器 另一方面 如果用户登录 我想显示主页视图控制器 所以流程会是这样的 当用户未登录时 显示
  • 使用 Networkx (Python) 进行图遍历

    我正在使用 Networkx 来管理依赖关系图 假设我有这个图 每个字母代表一个服务器 gt gt gt G nx Graph gt gt gt G add edge A B gt gt gt G add edge A H gt gt gt
  • Java - oracle.jdbc.dcn.DatabaseChangeEvent - 获取更改的行

    我正在使用 oracle jdbc dcn DatabaseChangeEvent 来从 Oracle DB 获取事件通知 public class TListener implements DatabaseChangeListener p
  • 无法更改 php 会话 cookie 名称

    我将现有且成功运行的站点复制到新的开发服务器 新服务器上的登录现在已损坏 我追踪到虽然会话 cookie 已重命名 ini set session name DOMAIN1 浏览器继续将会话 cookie 存储为 PHPSESSID 当我从
  • grpc找不到protobuf库

    我检查了 grpc 安装并完成了构建和安装 现在当我尝试 find package gRPC CONFIG REQUIRED I get CMake Error at CMakeLists txt 15 find package Found
  • Django 分页和“当前页面”

    我目前正在开发一个 Django 应用程序 它将利用臭名昭著的 分页 技术 我试图弄清楚 django core paginator 模块是如何工作的 我有一个带有问题模型的应用程序 我将使用此分页器列出所有问题 每页有 20 个问题 de
  • 重用named_scope来定义另一个named_scope

    我所看到的问题本质 有一天 如果我没有记错的话 我看到了一个重用一个named scope来定义另一个named scope的例子 像这样的东西 不记得确切的语法 但这正是我的问题 named scope billable conditio
  • Perl 6:反式(%h) 与反式(%h.keys => %h.values)

    还有一个问题是关于hash作为论据trans 在下面的代码中简单地取hash给出了错误的结果 但将其替换为keys and values使其正确 怎么了 my alph1
  • TSQL动态确定SP/Function的参数列表

    我想将通用日志记录片段写入存储过程集合中 我写这篇文章是为了对我们的前端用户体验进行定量测量 因为我知道前端软件使用了哪些 SP 以及它们的使用方式 我想在开始性能调优之前使用它来收集基线 然后显示调优的结果 我可以动态地从 PROCID
  • RSpec 中出现意外的 nil 变量

    我有一个非常基本的 RSpec 示例 但不起作用 这是代码 require spec helper describe Referral type functionality do describe Affiliate system do b
  • ChangeNotifierProxyProvider 给出可能为空的错误

    所以 遵循ChangeNotifierProxyProvider 文档 https pub dev documentation provider latest provider ChangeNotifierProxyProvider cla
  • 逐行比较两个不同长度的数据帧,并为每行添加具有相等值的列

    我在 python pandas 中有两个不同长度的数据帧 如下所示 df1 df2 Column1 Column2 Column3 ColumnA ColumnB 0 1 a r 0 1 a 1 2 b u 1 1 d 2 3 c k 2
  • libxml2属性修改C

    我想更改 xml 中的一个属性 电压
  • 无法为“python 3.3”安装“pip”,但在“python 2.7”上运行良好

    我是 python 新手 但不是编程 我的目标是学习 Django 进行 Web 开发 我一直在尝试安装更高版本的python pip and Django 我可以安装pip for python 2 7很好 但现在我正在尝试安装它pyth
  • 即使卸载后,旧的 GCM 令牌还会继续存在吗?

    我们一直致力于 GCM 实现 并注意到分配给应用程序安装的设备地址即使卸载应用程序也可以继续存在 因此 我们安装一个应用程序 获取令牌 A 设备订阅特定警报类型 1 消息令牌 A 并取得巨大成功 然后我们卸载该应用程序 不 我们重新安装 接