我读过推送订阅可能会导致浏览器和推送服务之间不同步。
我见过两种补救措施,两者看起来都是非标准的:
我认为任何应用程序都应该处理这两点,在这些点上订阅可以被识别为不同步(以及任何/全部)。
问题:
我正在尝试在渐进式网络应用程序中实现推送通知,并在 Chrome 中使用新的有效负载支持。
我正在尝试将端点和密钥发送到服务器,但在 PushSubscription 对象上看不到 keys 属性...
如何访问密钥以便将它们发送到服务器?
在客户端,订阅网页推送通知,您需要致电subscribe
与applicationServerKey
选项,如下所示:
var serviceWorkerRegistration = ...
serviceWorkerRegistration.pushManager.subscribe({
userVisibleOnly: true,
applicationServerKey: urlB64ToUint8Array("......")
}).then(function(subscription) {
...
})
Run Code Online (Sandbox Code Playgroud)
您可以将subscription
对象发送到可以保存对象的服务器。
要向订阅者发送推送消息,服务器需要发布到endpoint
对象中的键所指示的URL subscription
。服务器需要使用VAPID向提供商(Mozilla或Google或任何人)标识自己。例如,使用Python库pywebpush
,将进行以下调用:
import pywebpush
pywebpush.webpush(
subscription,
data,
vapid_private_key="path_to_private_key.pem",
vapid_claims={"sub": "mailto:example@example.com"},
)
Run Code Online (Sandbox Code Playgroud)
用于发送推送消息的私有VAPID密钥是否与serviceWorkerRegistration.pushManager.subscribe
在客户端传递的公共密钥相对应?还是它属于单独的密钥对?我的直觉告诉我它应该属于同一个密钥对,但是术语VAPID仅在谈论发送推送消息时才提到,而在订阅时却没有提到,因此我不确定该假设是正确的。
我们希望为我们开发的一些网站实现网络推送通知。大多数这些网站都是使用 Spring MVC 创建的。我想了解 FCM 是否是实现网络推送通知的最佳选择,或者是否还有其他选项(无需任何第三方集成)?即使 Web 应用程序未运行,我们也需要能够发送通知。
FCM 似乎更容易,但我们想知道它是否也有任何缺点?
我尝试为网页设置推送消息。虽然我了解前端部分(Push API)并且有一个工作的本地主机演示应用程序,但我只是不明白服务器如何将消息推送到浏览器。
推送服务中的包如何路由到客户端?客户端没有域名,通常也没有固定的IP地址,那怎么可能呢?
我已经阅读了Google 的 Web Push Libraries 指南和RFC 8030的部分内容,但如果他们有这个问题的答案,我却无法理解。
我已经实现了网络推送通知,现在我正在研究在浏览器中打开网站时使用服务工作者更新 DOM 的可能性。类似于如果您收到一条消息(或 SO),社交媒体网站的更新方式。
这是可能的,还是我吠错了树?
我曾尝试简单地告诉 service worker 查找某个元素并更新其内容,但这没有用。
刚刚开始使用推送通知,我设法处理所有订阅过程,并将端点和密钥保存在我的数据库上。我的问题是,我应该遵循什么策略(如果有)从数据库中删除旧的订阅详细信息?因此,如果有人允许通知并且他们撤销了该权限,我如何知道是谁从数据库中删除了详细信息?因为如果用户取消订阅,我只会从 PushManager 获得空订阅。
我计划向我的网络应用程序添加推送通知。
据我了解,要向用户推送通知,我可以使用Web 推送库并直接发送通知,也可以使用推送通知服务,例如 OneSignal、Firebase Cloud Messaging 或 Batch.com。
据我了解,这些服务提供了一站式解决方案,不仅可以通过 Web 推送方式发送通知,还可以向 iOS 和 Android 应用程序发送通知。
如果我现在只关注 Web 推送,那么我应该注意直接使用这些服务之一而不是 Web 推送库有什么优势吗?
我想从 NodeJs 向特定用户发送通知。我们的想法是,如果可能的话,独立于 Firebase 和任何类型的第三方服务器。我找到了很多有关如何构建服务工作者的信息以及很多有关显示通知的信息,但我找不到任何可以对我有用的关于将推送消息发送到要显示的工作者的信息。
这是service-worker.js
if ('serviceWorker' in navigator) {
navigator.serviceWorker.register('/layout/service-worker.js')
.then(function (registration) {
registration.pushManager.subscribe({
userVisibleOnly: true
}).then(function (subscription) {
isPushEnabled = true;
console.log("subscription.endpoint: ", subscription.endpoint);
//Here I will have to store the endpoint on my DB
});
}).catch(function (err) {
console.log(err);
});
}
//I think that this could be the listener, but I don't know how to trigger it from the server
this.onpush = function (event) {
console.log(event.data);
}
Run Code Online (Sandbox Code Playgroud)
我有这个代码用于显示通知(当我可以发送通知时)
var notificationTitle = 'Title';
var notificationOptions = { …
Run Code Online (Sandbox Code Playgroud) 我们的网络推送通知工作正常,但最近我们注意到端点将在不到一天的时间内过期,当我们最初尝试发送通知时,一切进展顺利,但后来它停止发送,当我们检查时,我们发现它是给出状态码 410
消息是
410 推送订阅已取消订阅或已过期
我们搜索了谷歌,发现了几个链接,上面说我们需要在每次链接过期时通过发送旧的和新的令牌来重新订阅,并将其保存在数据库中,但问题是我们有大量的订阅者,对每个订阅者都这样做是站不住脚的。最重要的是,人们不会一次又一次地打开网站,如果只有当客户再次打开网站时才能实现重新订阅,那么许多端点将会消失,因为除了少数非常受欢迎的网站之外,人们很少一次又一次地返回网站。
那么有什么方法可以通过服务器端的 php 交换旧端点来更新新端点,而不依赖于客户端呢?
他们已经订阅了我们的端点,但已过期。
或者我们是否可以首先延长生成的端点的到期时间?