随着 PWA 技术的成熟与普及,Web Push 通知也成为了一个广受欢迎的功能。PWA 的 Web Push 通知可使网站在未打开的状态下向用户发送实时通知,最大程度上提高用户体验。
本文将介绍 PWA 中 Web Push 通知的实现方法,包括如何在前端中生成一个 Push Subscription,如何将 Subscription 发送到后端服务,以及如何通过 Push 服务发送通知。
生成 Push Subscription
要使用 Web Push 通知,首先需要生成一个 Push Subscription。让我们看一下如何在前端中生成 Push Subscription。
// javascriptcn.com 代码示例 navigator.serviceWorker.register('sw.js').then(function(registration) { return registration.pushManager.subscribe({ userVisibleOnly: true, applicationServerKey: urlBase64ToUint8Array('YOUR_PUBLIC_KEY') // 替换成你的 VAPID 公钥 }); }).then(function(subscription) { console.log('用户已订阅:', JSON.stringify(subscription)); }).catch(function(error) { console.error('订阅失败:', error.message); }); function urlBase64ToUint8Array(base64String) { var padding = '='.repeat((4 - base64String.length % 4) % 4); var base64 = (base64String + padding) .replace(/\-/g, '+') .replace(/_/g, '/'); var rawData = window.atob(base64); var outputArray = new Uint8Array(rawData.length); for (var i = 0; i < rawData.length; ++i) { outputArray[i] = rawData.charCodeAt(i); } return outputArray; }
上述代码将显示一个订阅窗口,用户可以选择是否订阅通知。一旦用户点击“允许”请求,代码将通过 PushManager 来订阅 Push Subscription,并将 Subscription 保存到浏览器中。
发送 Subscription 到后端
现在我们已经生成了 Push Subscription,需要将 Subscription 发送到后端服务。服务端可以使用该 Subscription 来推送消息给客户端。
// javascriptcn.com 代码示例 fetch('/subscribe', { method: 'post', headers: { 'Content-type': 'application/json' }, body: JSON.stringify(subscription) }).then(function(response) { return response.json(); }).then(function(data) { console.log('订阅成功:', data); }).catch(function(error) { console.error('订阅失败:', error.message); });
上述代码将 Subscription 对象作为 JSON 串发送到服务器的 /subscribe
接口中。服务器需要将 Subscription 存储在数据库或缓存中,用于后续的消息推送。
发送 Web Push 通知
现在我们已经生成了 Push Subscription 并将其发送到服务器,下一步需要从服务器将 Push 消息发送到客户端浏览器。
在下面的代码中,我们将定义一个名为 sendPushNotification 的函数,该函数使用 Web Push 协议向客户端发送通知。
// javascriptcn.com 代码示例 function sendPushNotification(subscription, data) { fetch('/push', { method: 'post', headers: { 'Content-type': 'application/json' }, body: JSON.stringify({ subscription: subscription.toJSON(), data: data }) }).then(function(response) { return response.json(); }).then(function(data) { console.log('通知成功:', data); }).catch(function(error) { console.error('通知失败:', error.message); }); }
在 sendPushNotification 中,我们将 Subscription 对象及需要发送的数据打包成一个 JSON 对象,并发送到 /push
接口。服务器将使用该 Subscription 对象向客户端发送消息。
// javascriptcn.com 代码示例 var webpush = require('web-push'); webpush.setVapidDetails( 'mailto:your@email.com', 'YOUR_PUBLIC_KEY', 'YOUR_PRIVATE_KEY' ); app.post('/push', function(req, res) { var subscription = req.body.subscription; var data = req.body.data; var options = { TTL: 60 }; webpush.sendNotification( subscription, JSON.stringify(data), options ).then(function(result) { res.status(200).json({ message: '通知已发送' }); }).catch(function(error) { console.error('通知发送失败:', error); res.sendStatus(500); }); });
上述代码中,我们使用了一个名为 Web Push 的 JavaScript 库来实现消息的发送。使用库的第一步是设置 VAPID(Voluntary Application Server Identification)标识符,该标识符用于鉴别服务器和客户端之间的身份验证和通讯。
在发送通知的代码块中,我们从请求对象中获取 Push Subscription 和数据,并通过 Web Push 的 sendNotification 方法将消息发送给客户端。sendNotification 方法需要传递三个参数:Subscription 对象、消息内容以及通知选项(例如生存期、标题等)。
总结
在本文中,我们已经详细地介绍了 PWA 中 Web Push 通知的实现方式。我们从前端代码开始,生成 Push Subscription 并将其发送到后端服务,最后使用 Web Push 协议向客户端发送通知。希望通过本文的讲解,读者们能够理解 Web Push 通知的实现原理,并掌握使用 PWA 实现 Web Push 通知的技能。
来源:JavaScript中文网 ,转载请注明来源 本文地址:https://www.javascriptcn.com/post/654c6b1a7d4982a6eb5f0426