
web push 通知允许网站向用户发送消息,即使他们当前没有打开该网站。这依赖于几个核心组件:
在前端,实现Web Push通知主要包括以下步骤:注册Service Worker、请求通知权限以及将用户订阅信息发送至后端。
Service Worker 是 Web Push 通知的基础。它必须在一个单独的文件中,并在主页面加载时进行注册。
// app.js (或您的主应用脚本)
import convertVapidKey from 'convert-vapid-public-key'; // 假设您使用此库转换VAPID公钥
window.addEventListener('load', async () => {
// 检查浏览器是否支持Service Worker
if (!('serviceWorker' in navigator)) {
console.warn('[Service Worker] 您的设备或环境不支持Service Worker!');
return;
}
let registration;
try {
// 注册Service Worker,指定其作用域
registration = await navigator.serviceWorker.register(window.serviceWorkerPath, {
scope: '/' // Service Worker 的作用域,通常是根路径
});
console.info('[Service Worker] 注册成功:', registration);
} catch (error) {
console.warn('[Service Worker] 注册失败:', error);
return;
}
// 2. 订阅通知
// 检查Web Push相关API是否可用
if (
!window.webpushServerKey || // VAPID公钥
!('Notification' in window) ||
!('PushManager' in window)
) {
console.warn('[WebPush Client] 您的设备或环境不支持Web Push!');
return;
}
try {
// 请求通知权限
if (await Notification.requestPermission() === 'granted') {
await subscribe(); // 权限授予后进行订阅
// 成功订阅后,可以立即发送一个本地通知作为确认
await registration.showNotification('恭喜!?', {
body: '您已成功订阅通知!?'
});
}
} catch (error) {
console.warn('[WebPush Client] 订阅失败:', error);
}
async function subscribe() {
try {
// 客户端订阅推送服务
const subscription = await registration.pushManager.subscribe({
userVisibleOnly: true, // 强制每次推送都显示通知
applicationServerKey: convertVapidKey(window.webpushServerKey) // 您的VAPID公钥
});
// 将订阅信息发送到后端存储
await fetch('/webpush/', {
method: 'POST',
mode: 'cors',
credentials: 'include',
cache: 'default',
headers: new Headers({
'Accept': 'application/json',
'Content-Type': 'application/json'
}),
body: JSON.stringify({ subscription })
});
console.info('[WebPush Client] 订阅成功:', subscription);
} catch (error) {
console.warn('[WebPush Client] 订阅失败:', error);
}
}
});Service Worker 负责接收来自后端推送服务的消息。当后端发送推送通知时,Service Worker 中的 push 事件监听器会被触发。
// sw.js (Service Worker 脚本)
self.addEventListener('push', event => {
try {
// 解析推送数据
const json = event.data.json();
const title = json.title || '';
const options = json.options || {};
console.info('[Service Worker] 收到推送事件:', json);
// 使用waitUntil确保通知在Service Worker关闭前显示
event.waitUntil(self.registration.showNotification(title, options));
} catch (error) {
console.warn('[Service Worker] 推送通知处理失败:', error);
}
});后端负责存储用户订阅信息,并使用 VAPID 密钥对通过推送服务向用户发送通知。具体的实现会依赖于您选择的后端语言和库。
// 示例(PHP,使用BenTools\WebPushBundle) /** @var \BenTools\WebPushBundle\Sender\PushMessageSender $sender */ protected $sender; // ... // 构建推送消息内容 $message = new \BenTools\WebPushBundle\Model\Message\PushNotification($title, [ PushNotification::BODY => $notification->getBody(), // ... 其他通知选项,如图标、点击行为等 ]); // 向所有订阅者发送消息 $this->sender->push($notification->createMessage(), $subscriptions);
在后端发送推送通知时,您需要:
尽管前端和服务工作者代码在其他浏览器(如macOS Chrome, Android Chrome, Samsung Internet)上工作正常,但在iOS Safari上,从后端发送的推送通知可能无法接收。这并非代码错误,而是iOS Safari对Web Push通知的特定限制。
核心问题: 根据WebKit官方博客和caniuse.com的资料,iOS Safari (16.4及更高版本) 上的Web Push通知有一个关键限制:网站必须首先被用户添加到主屏幕(Add to Home Screen)才能接收来自后端的推送通知。
这意味着,如果用户只是在Safari浏览器中访问您的网站,即使他们授予了通知权限,Service Worker 的 push 事件监听器也不会被触发来接收后端推送。只有当您的网站作为一个“Web App”被添加到主屏幕后,它才具备接收后端推送通知的能力。
解决方案:
在iOS Safari上实现Web Push通知,除了常规的Service Worker注册、权限请求和订阅流程外,最关键的一点是要求用户将网站“添加到主屏幕”。这一独特的限制是iOS生态系统为了提供更类似于原生应用体验而设定的。理解并妥善处理这一要求,是确保您的Web Push功能在iOS设备上全面生效的关键。开发者应在产品设计和用户引导中充分考虑这一特性,以提供无缝的通知体验。
以上就是iOS Safari Web Push 通知实现与常见问题解析的详细内容,更多请关注php中文网其它相关文章!
每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号