gmail 应用程序如何处理 iOS 中的推送通知?

How does the gmail app handle push notifications in iOS?

我正在尝试在 iOS 上复制 gmail 对推送通知的处理。我正在查看两种行为:

  1. 当一封新邮件发送到我的收件箱时,我会收到一条新通知,徽章编号也会相应增加。
  2. 当我 read/delete 在 gmail 网站上发送电子邮件时,徽章编号会相应减少 - 尽管通知并没有像在 Android 上那样被删除。

虽然第一个非常简单,但第二个真正让我感到困惑,特别是考虑到即使在我终止 gmail 应用程序 and/or 重新启动设备后也会发生这种情况。

根据我 read/experimented 的说法,当应用程序不是 运行 时,它只能接收必须包含显示通知的远程消息。这些可以通过实施 UNNotificationServiceExtension 来拦截和修改,但最终 必须 向用户显示通知,否则系统将负责执行此操作。

所以我的问题是,当 gmail 应用程序没有收到邮件时,它使用什么技巧来接收邮件 运行 以及它如何防止这些邮件最终出现在系统托盘中?

我终于找到了解决办法。我正在使用 FCM,所以诀窍是发送一个包含 notification 对象的消息负载。 notification 对象应该只包含 badge 值。这将导致更新徽章而不在通知托盘中显示任何内容。

但是请务必注意,此消息不能由应用 intercepted/modified(也不能由 UINotificationExtension)发送,因此应牢记以下几点:

  1. 需要在服务器端跟踪正确的徽章编号。

  2. 向此消息传递数据可能是徒劳的,因为它会丢失。

  3. 不能将其用作在应用程序中执行任何操作的触发器。

  4. 只有当徽章编号达到 0 时,这才是真正有用的删除应用程序所有通知的方法。