web push通知是一种允许网站向用户发送消息的技术,即使在用户未主动访问网站时也能实现。它通常涉及以下几个核心组件:
整个流程通常是:前端通过Service Worker订阅推送服务,获取一个PushSubscription对象并发送给后端服务器存储。当后端需要发送通知时,使用存储的PushSubscription和VAPID密钥,通过推送服务(如Google的FCM、Apple的APNs等)将消息推送到用户设备。Service Worker接收到消息后,利用Notifications API在设备上显示通知。
在实践中,开发者可能会发现Web Push通知在macOS Chrome、Android Chrome和Samsung Internet等浏览器上工作正常,但在iOS Safari上,尤其当通知由后端触发时,却无法成功接收。这并非Service Worker的push事件本身不支持,而是iOS Safari对Web Push通知的投递机制有着独特的限制。
根据Apple的Web Push文档和相关资源,iOS Safari(自iOS 16.4及更高版本)对Web Push的支持有一个关键前提:只有当网站被用户添加到主屏幕(即作为渐进式Web应用PWA运行)时,才能接收到由后端发送的推送通知。 这意味着,如果用户仅仅在Safari浏览器中打开了你的网站,即使Service Worker已注册、权限已授予,也无法接收到来自后端的推送。而前端直接通过registration.showNotification()触发的通知,由于是在当前页面上下文执行,不受此限制。
前端实现Web Push通知主要包括Service Worker的注册、通知权限的请求以及订阅信息的发送。
注册Service Worker: Service Worker是Web Push通知的基础。它需要在页面加载时进行注册。
import convertVapidKey from 'convert-vapid-public-key'; window.addEventListener('load', async () => { if (!('serviceWorker' in navigator)) { console.warn('[Service Worker] Service Worker is not available for your device or environment!'); return; } let registration; try { registration = await navigator.serviceWorker.register(window.serviceWorkerPath, { scope: '/' // 定义Service Worker的作用域 }); console.info('[Service Worker] Registration succeeded:', registration); } catch (error) { console.warn('[Service Worker] Registration failed:', error); return; } // ... 后续订阅逻辑 });
请求通知权限并订阅推送: 在Service Worker注册成功后,需要向用户请求通知权限。一旦用户授予权限,即可通过pushManager.subscribe()方法获取PushSubscription对象。这个对象包含了推送服务的URL和加密密钥,是后端发送通知的必要信息。
// ... 承接上文 Service Worker 注册成功后 if ( !window.webpushServerKey || // VAPID 公钥 !('Notification' in window) || !('PushManager' in window) ) { console.warn('[WebPush Client] Web push is not available for your device or environment!'); return; } try { if (await Notification.requestPermission() === 'granted') { await subscribe(); // 调用订阅函数 // 成功订阅后,可以发送一个前端触发的通知进行确认 await registration.showNotification('Congratulations! ?', { body: 'You have subscribed to the notifications successfully! ?' }); } } catch (error) { console.warn('[WebPush Client] Subscription failed:', 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 succeeded:', subscription); } catch (error) { console.warn('[WebPush Client] Subscription failed:', error); } }
Service Worker中的push事件监听: Service Worker需要监听push事件来接收来自后端的消息,并使用showNotification方法在用户设备上显示通知。
// 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] Push event received with:', json); // 使用 event.waitUntil 确保通知在Service Worker休眠前显示 event.waitUntil(self.registration.showNotification(title, options)); } catch (error) { console.warn('[Service Worker] Push notification failed:', error); } });
后端负责存储前端发送的PushSubscription信息,并在需要时利用这些信息向推送服务发送通知。通常会使用专门的库来处理VAPID签名和推送请求。
例如,在PHP中,可以使用像bentools/webpush-bundle这样的库:
/** @var \BenTools\WebPushBundle\Sender\PushMessageSender */ protected $sender; // ... // 构建推送消息内容 $message = new \BenTools\WebPushBundle\Model\Message\PushNotification($title, [ PushNotification::BODY => $notification->getBody(), // ... 其他通知选项,如图标、点击URL等 ]); // 遍历所有订阅并发送推送 // $subscriptions 应该是一个包含所有 PushSubscription 对象的数组 $this->sender->push($notification->createMessage(), $subscriptions);
后端发送的PushNotification对象会被转换为加密的有效载荷,并通过HTTP/2协议发送到相应的推送服务(如Apple Push Notification Service for iOS设备)。
如前所述,iOS Safari接收后端推送通知的核心在于将网站添加到主屏幕。
因此,如果你的Web Push通知在iOS Safari上无法从后端接收,请务必检查用户是否已将你的网站添加到主屏幕。
在iOS Safari上实现Web Push通知,尤其是从后端触发的推送,其关键在于理解并满足Apple的特定要求——即网站必须被用户添加到主屏幕。一旦满足这一条件,配合标准的Service Worker注册、权限请求、订阅存储和后端推送逻辑,Web Push通知就能在iOS设备上如期工作。开发者应在设计和推广其Web Push功能时,充分考虑到这一平台差异,并为用户提供清晰的指引。
以上就是iOS Safari Web Push通知:从后端推送的实现与关键考量的详细内容,更多请关注php中文网其它相关文章!
每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。
Copyright 2014-2025 //m.sbmmt.com/ All Rights Reserved | php.cn | 湘ICP备2023035733号