为什么我的Push订阅会很快失效?

6
我按照此教程实现了网页应用程序的推送通知功能,虽然它们能够工作,但是它们很快就停止工作了。它似乎可以很好地处理前几个通知,但之后,有时在不到五分钟的时间内,订阅就会过期,这是根据我的后端返回的信息。我从推送服务中获取到410错误代码,而该教程指出这意味着订阅已过期。
这太疯狂了,在不到五分钟的时间内如何会过期?我搜索了我的问题,似乎没有其他人遇到这个问题,甚至有人说订阅可以持续数年
我尝试在服务工作者中为“pushsubscriptionchange”事件实现事件侦听器,但根据Serginho的答案,自2019年以来Chrome没有实现该事件,我认为至今仍然未改变。
哦,而且虽然Chrome可以处理订阅(但仅限于上述情况),但Firefox甚至什么都不做。我感觉自己快疯了。但如果我使用此网站测试推送订阅功能,Firefox和Chrome都可以正常工作!他们在做什么我不知道?他们显示的代码与我上面链接的教程完全相同。
在这一点上,我该怎么办呢?我考虑过使用setInterval()创建一个间隔,每秒钟重新订阅用户一次左右,但我认为这样做行不通。
任何帮助都将不胜感激。

1
这个问题困扰我已经一年多了。同样的问题。我尝试使用cron-job发送推送通知,但只有第一天有效。在接下来的几天里,它就会过期并变得无用。有任何更新吗? - Luis Febro
3个回答

4

你绝对需要在你的 Service Worker 中处理 pushsubscriptionchange 事件。否则,当订阅到期并被新订阅替换时,你将会失去这个订阅。

事实上,Chrome 和大多数浏览器都会触发该事件(我不知道你从哪里读到了不同的说法)。我们确定它会被触发,因为我们的推送服务每小时会收到数千次来自该事件的请求。

如果你需要如何实现该事件的灵感,请查看我们的 Service Worker。然后在你的服务器上,简单地用新订阅替换旧订阅即可。


嘿@collimarco,我正在尝试监听pushsubscriptionchange事件并将其输出到控制台,但是它对我们不起作用。我已经在Edge、Chrome和Opera上尝试过了。 - Chirag Gupta
2
我遵循了每一个建议,但它们都没有起作用。从pushsubsriptionchange中永远不会触发任何内容。我不知道你是如何触发它的,但Chrome不支持它。https://bugs.chromium.org/p/chromium/issues/detail?id=646721 - Luis Febro
你是在使用 Google GCM 还是其他提供商,比如 OneSignal 吗? - Luis Febro
2
Chrome目前尚未实现pushsubscriptionchange功能:https://chromestatus.com/feature/6242325854420992 - csvan

0

你是否在浏览器中进行了硬刷新?我们最近正在开发 Web 推送集成,但遇到了一些硬刷新的问题,作为开发者,我们需要不断地确保最新的应用程序在浏览器中运行。

硬刷新即 Ctrl + F5 或 Command + R 不仅会强制刷新缓存,还会过期您的应用程序推送订阅,并导致您的服务工作者未被注册。例如,请参见 Register service worker after hard refresh

如果您正在积极测试应用程序,订阅 PUSH 通知,将您的 Push 订阅传递给后端,然后对应用程序进行硬刷新,则会使您的订阅过期。

如果是这种情况,您可以处理硬刷新。您需要检测服务工作者是否已注册。如果没有,请执行软重新加载,以注册您的服务工作者。

您还需要更频繁地将 Push 订阅发送到后端。

在我们的 UI 应用程序中,一个 Angular SPA,我们订阅了 SWPush.PushSubscription,当该 Push 订阅更改时,我们将其推送到后端 API。

这可以确保无论用户何时进行硬刷新、通过浏览器设置管理通知设置等操作,我们的应用程序始终具备最新的用户推送订阅。


0
我遵循了this的教程在我的 Web 应用程序中实现了推送通知,尽管它们可以工作,但它们很快就会停止工作。它似乎可以很好地处理前几个通知,但是在此之后,有时当不到五分钟时,订阅就会过期(根据我的后端)。
我认为不可能在不到五分钟内订阅即过期。实际上,据我所知,在 Firefox 或 Chrome 中,订阅永远不会过期。
从推送服务中获取 410 错误代码,而教程说这意味着订阅已过期。HTTP 410 Gone 错误表示订阅已经不存在,这与表示其已过期不同。还有其他订阅可能停止存在的方式,例如:
  • pushSubscription对象具有一个unsubscribe()方法[MDN链接],如果您在站点JavaScript中调用它,则推送订阅将被删除。
  • 只有用户允许推送通知才能正常工作。如果用户撤销了网站发送通知的权限,则推送订阅将被删除。

我不知道这两者是否适用于您的设置。建议在客户端代码中添加尽可能多的日志记录,以尝试缩小问题出现的范围。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接