Deprecated: imwpcache\f884414bce24ee67f\f73723ec7b1919fa5::__construct(): Implicitly marking parameter $YECBGYFECGEAFWHA as nullable is deprecated, the explicit nullable type must be used instead in /www/wwwroot/www.chuangxiangniao.com/wp-content/plugins/imwpcache-dist/build/f884414bce24ee67ff73723ec7b1919fa5.php on line 2

Deprecated: imwpcache\f884414bce24ee67f\f73723ec7b1919fa5::__construct(): Implicitly marking parameter $BBWFDDBHHYHDXXAB as nullable is deprecated, the explicit nullable type must be used instead in /www/wwwroot/www.chuangxiangniao.com/wp-content/plugins/imwpcache-dist/build/f884414bce24ee67ff73723ec7b1919fa5.php on line 2
Angular应用中通过自定义服务调用Service Worker推送通知_创想鸟

Angular应用中通过自定义服务调用Service Worker推送通知

Angular应用中通过自定义服务调用Service Worker推送通知

本文详细阐述了如何在angular应用中利用自定义服务与service worker通信,进而触发本地推送通知。内容涵盖service worker的注册与配置、在angular服务中请求通知权限、获取service worker注册对象以及调用`shownotification()`方法显示通知的完整流程,并强调了权限管理、平台兼容性等关键注意事项,旨在提供一套专业且实用的客户端通知实现方案。

引言

在现代Web应用中,推送通知是提升用户参与度和体验的重要功能。Service Worker作为浏览器在后台运行的脚本,是实现离线功能和推送通知的核心。本文将指导您如何在Angular应用中,通过自定义服务与Service Worker交互,从而在客户端触发和显示推送通知。

1. Service Worker的注册与基础配置

首先,确保您的Angular应用已注册Service Worker。对于使用 @angular/pwa 方案的应用,Service Worker(通常是 ngsw-worker.js)会在构建时自动生成并注册。如果未采用 @angular/pwa,您可能需要在 main.ts 或 app.module.ts 中手动注册 Service Worker。

示例:手动注册 Service Worker (在 main.ts 或 app.component.ts 中)

// 在应用启动时注册 Service Workerif ('serviceWorker' in navigator) {  navigator.serviceWorker.register('/sw.js') // 假设您的 Service Worker 文件名为 sw.js    .then(registration => console.log('Service Worker 注册成功:', registration))    .catch(error => console.error('Service Worker 注册失败:', error));}

Service Worker 文件 (sw.js) 本身可以保持精简,因为它主要负责在后台处理事件。对于本文讨论的客户端触发通知场景,sw.js 甚至不需要特殊的 push 事件监听器,因为我们直接通过 registration.showNotification() 来显示通知。然而,一个完整的 Service Worker 通常会包含 push 和 notificationclick 事件处理,以应对来自服务器的真实推送和用户点击通知的交互。

示例:sw.js (Service Worker 文件)

// sw.jsself.addEventListener('install', (event) => {  console.log('Service Worker: 安装');  self.skipWaiting(); // 强制新的 Service Worker 立即激活});self.addEventListener('activate', (event) => {  console.log('Service Worker: 激活');  event.waitUntil(clients.claim()); // 确保 Service Worker 控制所有客户端});// 虽然本文侧重于客户端触发通知,但为完整性考虑,这里展示了处理服务器推送的示例self.addEventListener('push', (event) => {  const data = event.data ? event.data.json() : { title: '默认标题', body: '默认消息' };  const options = {    body: data.body,    icon: 'assets/icons/icon-192x192.png', // 替换为您的图标路径    vibrate: [100, 50, 100],    data: {      url: data.url || '/' // 可选:通知点击后跳转的URL    }  };  event.waitUntil(    self.registration.showNotification(data.title, options)  );});// 处理用户点击通知事件self.addEventListener('notificationclick', (event) => {  event.notification.close(); // 关闭通知  event.waitUntil(    clients.matchAll({ type: 'window' }).then((clientList) => {      const clickedClient = clientList.find(client => client.url.includes(event.notification.data.url) && 'focus' in client);      if (clickedClient) {        clickedClient.focus(); // 如果页面已打开,则聚焦      } else {        clients.openWindow(event.notification.data.url || '/'); // 否则打开新页面      }    })  );});

2. 创建Angular自定义服务

接下来,我们将在Angular应用中创建一个自定义服务,用于封装通知相关的逻辑。

生成服务:

ng generate service notification

notification.service.ts (服务文件)

import { Injectable } from '@angular/core';@Injectable({  providedIn: 'root'})export class NotificationService {  constructor() { }  /**   * 检查浏览器是否支持通知和Service Worker   * @returns {boolean} 如果支持则返回 true,否则返回 false   */  public isSupported(): boolean {    return 'Notification' in window && 'serviceWorker' in navigator;  }  /**   * 请求通知权限并显示本地通知   * @param title 通知标题   * @param options 通知选项 (如 body, icon, data 等)   * @returns {Promise}   */  public async showLocalNotification(title: string, options?: NotificationOptions): Promise {    if (!this.isSupported()) {      console.warn('浏览器不支持通知或Service Worker。');      return;    }    try {      // 1. 请求用户通知权限      const permission = await Notification.requestPermission();      if (permission === 'granted') {        // 2. 获取 Service Worker 注册对象        const registration = await navigator.serviceWorker.ready;        // 3. 通过 Service Worker 注册对象显示通知        await registration.showNotification(title, options);        console.log('通知已通过 Service Worker 显示。');      } else {        console.warn('用户拒绝了通知权限。');      }    } catch (error) {      console.error('显示通知时发生错误:', error);    }  }  /**   * (可选) 订阅真实的 Web Push 通知,需要后端支持   * @returns {Promise}   */  public async subscribeToPushNotifications(): Promise {    if (!this.isSupported()) {      console.warn('浏览器不支持通知或Service Worker。');      return null;    }    try {      const permission = await Notification.requestPermission();      if (permission === 'granted') {        const registration = await navigator.serviceWorker.ready;        const subscription = await registration.pushManager.subscribe({          userVisibleOnly: true, // 必须为 true          applicationServerKey: this.urlBase64ToUint8Array('YOUR_VAPID_PUBLIC_KEY') // 替换为您的VAPID公钥        });        console.log('用户已订阅推送通知:', subscription);        // 通常会将 subscription 对象发送到您的后端服务器        return subscription;      } else {        console.warn('用户拒绝了通知权限,无法订阅。');        return null;      }    } catch (error) {      console.error('订阅推送通知时发生错误:', error);      return null;    }  }  // 辅助函数:将Base64字符串转换为Uint8Array (VAPID公钥需要)  private urlBase64ToUint8Array(base64String: string): Uint8Array {    const padding = '='.repeat((4 - base64String.length % 4) % 4);    const base64 = (base64String + padding)      .replace(/-/g, '+')      .replace(/_/g, '/');    const rawData = window.atob(base64);    const outputArray = new Uint8Array(rawData.length);    for (let i = 0; i < rawData.length; ++i) {      outputArray[i] = rawData.charCodeAt(i);    }    return outputArray;  }}

请注意:

showLocalNotification 方法是本文的核心,它直接通过 Service Worker 注册对象显示通知。subscribeToPushNotifications 是为了展示如何订阅由后端服务器触发的“真实”Web Push通知。这需要一个 VAPID 公钥,并且订阅信息需要发送到您的后端进行管理。

3. 在组件中调用通知服务

现在,您可以在任何Angular组件中注入 NotificationService 并调用其方法来显示通知。

示例:在组件中使用 NotificationService

import { Component } from '@angular/core';import { NotificationService } from './notification.service'; // 调整路径@Component({  selector: 'app-home',  template: `    

通知示例

`})export class HomeComponent { constructor(private notificationService: NotificationService) { } async triggerLocalNotification() { await this.notificationService.showLocalNotification( '来自Angular应用的本地通知', { body: '这是一条通过Service Worker显示的通知内容。', icon: 'assets/icons/icon-72x72.png', // 替换为您的图标路径 image: 'assets/images/notification-image.jpg', // 可选:通知图片 vibrate: [200, 100, 200, 100, 200], data: { url: '/dashboard' // 点击通知后跳转的内部路径 }, actions: [ { action: 'view-details', title: '查看详情', icon: 'assets/icons/icon-48x48.png' }, { action: 'dismiss', title: '忽略', icon: 'assets/icons/icon-48x48.png' } ] } ); } async subscribeToPush() { const subscription = await this.notificationService.subscribeToPushNotifications(); if (subscription) { console.log('成功订阅,订阅信息:', subscription); // 在这里将 subscription 对象发送到您的后端服务器 } else { console.warn('未能订阅推送通知。'); } }}

4. 关键注意事项

用户权限管理 在显示任何通知之前,务必通过 Notification.requestPermission() 请求用户授权。用户可以选择“允许”、“拒绝”或“忽略”。只有在用户明确授权后,通知才能正常显示。Service Worker 生命周期: Service Worker 有自己的生命周期(安装、激活、空闲、终止)。确保您的 Service Worker 能够被正确安装和激活,navigator.serviceWorker.ready Promise 会在 Service Worker 激活并准备好控制页面时解析。平台兼容性:iOS/Safari: Apple 对Web Push Notification有严格的限制。在iOS上,Web Push通常只适用于添加到主屏幕的渐进式Web应用(PWA),且其行为可能与桌面浏览器有所不同。直接通过 registration.showNotification() 在普通网页中触发通知,在iOS上可能无法按预期工作或需要特定的用户交互。对于来自服务器的Web Push,iOS 16.4及更高版本提供了更广泛的支持,但仍有其特殊性。桌面/Android: 大多数现代桌面浏览器和Android设备对Web Push Notification的支持较好,showNotification() 通常能正常工作。通知数据负载: showNotification() 方法接受一个可选的 options 对象,您可以在其中定义通知的 body、icon、image、vibrate、data 以及 actions 等属性,以丰富通知的内容和交互性。本地通知 vs. Web Push:本文主要演示的是通过 registration.showNotification() 在客户端直接显示的本地通知。这种通知不需要后端服务器参与,但通常只能在用户当前打开页面或 Service Worker 活跃时显示。Web Push Notification 则是指由后端服务器通过Push API发送到用户设备的通知,即使浏览器关闭,Service Worker也能在后台接收并显示。这需要更复杂的后端实现和VAPID密钥。subscribeToPushNotifications 方法是实现这一点的第一步。

总结

通过遵循上述步骤,您可以在Angular应用中成功地通过自定义服务与Service Worker通信,从而实现强大的客户端通知功能。理解Service Worker的机制、正确管理用户权限以及关注不同平台的兼容性是构建健壮通知系统的关键。无论是本地提醒还是与后端集成的Web Push,Service Worker都为您的Angular应用带来了更丰富的用户交互可能性。

以上就是Angular应用中通过自定义服务调用Service Worker推送通知的详细内容,更多请关注创想鸟其它相关文章!

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 chuangxiangniao@163.com 举报,一经查实,本站将立刻删除。
发布者:程序猿,转转请注明出处:https://www.chuangxiangniao.com/p/1528539.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
Jest 模拟模块方法调用断言指南
上一篇 2025年12月20日 20:22:07
Angular应用中从自定义服务触发Service Worker通知显示
下一篇 2025年12月20日 20:22:24

相关推荐

  • 京东外卖店铺能变更营业执照吗?京东外卖店铺能变更营业执照吗怎么办

    京东外卖店铺变更经营主体需先确认资格并准备材料,如营业执照、法人身份证、品牌授权书等,确保店铺运营满一年且无重大违规;随后登录商家后台提交申请,填写新主体信息并上传文件;等待平台1-3个工作日审核,通过后进入7天公示期;公示无异议后,完成线下工商变更并更新银行账户信息,最后在后台上传新证照,待平台确…

    2026年9月22日
    400
  • 喵趣漫画官网登录页面 喵趣漫画免费阅读全本漫画

    喵趣漫画官网登录页面位于其官方网站https://www.miaoqumanhua.com/,用户可直接通过浏览器访问并登录账号。 喵趣漫画官网登录页面在哪里?这是不少网友都关注的,接下来由PHP小编为大家带来喵趣漫画免费阅读全本漫画的相关信息,感兴趣的网友一起随小编来瞧瞧吧! https://ww…

    2026年9月22日
    000
  • 荣耀GT 2系列配置曝光:9000mAh电池+165Hz直屏

    荣耀GT 2系列配置曝光:9000mAh电池+165Hz直屏荣耀GT 2系列配置曝光:9000mAh电池+165Hz直屏荣耀GT 2系列配置曝光:9000mAh电池+165Hz直屏荣耀GT 2系列配置曝光:9000mAh电池+165Hz直屏

    10月13日,一位数码博主透露,某款搭载骁龙8系旗舰平台的新机正在规划一款硅基电池,其容量预计将达到约9000mah。这一超大电池容量在当前智能手机市场中极为少见,意味着该机型在续航能力上将拥有显著优势。结合该博主的暗示以及网友的讨论分析,这款新机极有可能是即将发布的荣耀gt 2系列。 荣耀GT P…

    2026年9月22日 用户投稿
    100
  • QQ阅读最新版本_QQ阅读官网下载链接

    QQ阅读最新版本官网下载链接是http://book.qq.com/,该平台提供海量正版小说资源,支持多格式电子书阅读,设有免费专区,并具备个性化设置、跨设备同步及互动社区等功能。 QQ阅读最新版本官网下载链接在哪里?这是不少网友都关注的,接下来由PHP小编为大家带来QQ阅读最新版本的相关信息,感兴…

    2026年9月22日
    000
  • PHP匿名函数怎么用_PHP匿名函数使用场景分析

    PHP匿名函数是无名函数,可作为回调或赋值给变量,常用在数组处理、事件回调、逻辑封装等场景,支持use引入外部变量及fn短语法,结合bindTo可访问对象私有成员。 PHP匿名函数,也叫闭包函数(Closure),是一种没有名称的函数,通常作为回调使用或赋值给变量。它在实际开发中非常灵活,尤其适合用…

    2026年9月22日
    100
  • 中国联通正式获得开展 eSIM 手机运营服务商用试验的批复

    感谢网友 会弹琴的九号、学士 的线索投递! 10月13日,三大运营商官方微信号相继发布消息,宣告eSIM服务进入新阶段。其中,中国联通于当日上午10:00率先发布推文《抢约!联通eSIM来了!》,动作迅速,展现出强烈的市场积极性;中国移动在傍晚19:29发布《中国移动全面上线eSIM手机办理》;而中…

    2026年9月22日
    200
  • mysql怎么使用全文索引 mysql创建全文索引的配置方法

    mysql怎么使用全文索引 mysql创建全文索引的配置方法mysql怎么使用全文索引 mysql创建全文索引的配置方法mysql怎么使用全文索引 mysql创建全文索引的配置方法mysql怎么使用全文索引 mysql创建全文索引的配置方法

    mysql使用全文索引的核心是让数据库像搜索引擎一样理解并高效检索文本内容。1. 创建全文索引:可在建表时或之后通过alter table语句为char、varchar或text字段添加fulltext索引;2. 使用match against查询:支持自然语言模式(自动过滤停用词并按相关性排序)和…

    2026年9月22日 用户投稿
    100
  • VSCode如何通过调试变量监视列表批量追踪数据变化 VSCode变量监视列表批量追踪的新颖技巧​

    VSCode如何通过调试变量监视列表批量追踪数据变化 VSCode变量监视列表批量追踪的新颖技巧​VSCode如何通过调试变量监视列表批量追踪数据变化 VSCode变量监视列表批量追踪的新颖技巧​VSCode如何通过调试变量监视列表批量追踪数据变化 VSCode变量监视列表批量追踪的新颖技巧​VSCode如何通过调试变量监视列表批量追踪数据变化 VSCode变量监视列表批量追踪的新颖技巧​

    vscode中高效批量追踪数据变化的关键是将监视列表用作表达式求值器,而非仅添加单一变量;2. 可在监视列表中添加复杂对象路径(如user.profile.address.city)、计算表达式(如(a + b) * c)、函数调用(如calculatetotal(items))或条件判断(如myv…

    2026年9月22日 用户投稿
    000
  • 在Java中如何统计List中元素出现次数

    答案是使用Map或Stream API统计List元素频次最高效。通过HashMap手动遍历统计,或用Java 8的Stream结合groupingBy和counting()实现简洁计数,Collections.frequency适用于小数据量但性能较差,推荐Stream方式兼顾性能与可读性。 在J…

    2026年9月22日
    900
  • 如何设置Linux服务超时参数 systemd服务超时配置

    如何设置Linux服务超时参数 systemd服务超时配置如何设置Linux服务超时参数 systemd服务超时配置如何设置Linux服务超时参数 systemd服务超时配置如何设置Linux服务超时参数 systemd服务超时配置

    systemd服务超时参数调整方法包括:1.使用systemctl show查看timeoutstartsec、timeoutstopsec、timeoutsec字段获取当前配置;2.通过systemctl edit编辑unit文件设置timeoutstartsec、timeoutstopsec或t…

    2026年9月22日 用户投稿
    000
  • 360浏览器如何切换极速模式

    在浏览网页时,想要获得更流畅、更快速的上网体验,许多用户都希望将360浏览器切换至极速模式。那么具体该如何操作呢?以下是几种简单有效的方法。 方法一:通过地址栏图标一键切换 打开360浏览器后,留意地址栏右侧,会看到一个闪电图标和一个书本图标的组合。其中,闪电代表极速模式,书本则代表兼容模式。只需点…

    2026年9月22日
    100
  • c盘清理工具哪个好用_好用的C盘清理工具推荐与使用评测

    推荐C盘清理方案:系统自带工具如磁盘清理、存储感知和手动清%temp%目录安全可靠,适合日常维护;第三方工具CCleaner、金舟Windows优化大师、风云C盘清理大师和全能C盘清理专家提供一键深度清理,操作便捷且误删率低;空间分析工具WizTree、SpaceSniffer和TreeSize可可…

    2026年9月22日
    000
  • mysql安装完如何诊断 mysql慢查询分析与优化方法

    要解决 mysql 慢查询问题,首先要开启慢查询日志,其次使用 mysqldumpslow 分析日志,再通过 explain 查看执行计划,最后根据常见优化建议改进 sql 和索引。具体步骤如下:一、修改配置文件或动态开启慢查询日志,并设置阈值和路径;二、使用 mysqldumpslow 工具分析慢…

    2026年9月22日
    100
  • 主板供电相数对CPU超频稳定性的影响:14相 vs. 20相实测

    20相供电主板在超频下表现更稳,实测显示其VRM温度更低、电压波动更小、性能输出更一致,尤其适合极限超频和高负载场景,而14相供电配合优质用料也能满足主流超频需求,普通用户无需盲目追求高相数。 主板供电相数直接影响CPU在高负载和超频状态下的电压稳定性和温度控制。很多人在选择主板时会看到“14相”或…

    2026年9月22日
    200
  • PHP如何实现视频留言评论_PHP实现视频留言评论功能

    答案:通过数据库设计、前端表单、后端处理和评论展示四步实现PHP视频留言功能。1. 创建comments表存储信息;2. 构建表单提交昵称与评论;3. 用add_comment.php接收并存入数据库;4. 在页面读取并安全输出评论,防止XSS。 要实现视频留言评论功能,PHP可以结合前端页面、数据…

    2026年9月22日
    000
  • mysql安装后怎么建表 mysql创建数据表的详细步骤

    mysql安装后怎么建表 mysql创建数据表的详细步骤mysql安装后怎么建表 mysql创建数据表的详细步骤mysql安装后怎么建表 mysql创建数据表的详细步骤mysql安装后怎么建表 mysql创建数据表的详细步骤

    安装完 mysql 后,建表的关键在于先创建数据库并选择使用,然后通过 create table 语句定义表结构。1. 创建数据库:使用 create database mydatabase; 创建数据库;2. 使用数据库:通过 use mydatabase; 选择当前操作的数据库;3. 建表语法:…

    2026年9月22日 用户投稿
    200
  • 夸克浏览器电脑网页版访问入口 夸克官网主页链接地址

    夸克浏览器电脑网页版访问入口是https://www.quark.cn/,用户可直接在浏览器地址栏输入该链接访问,其界面采用极简设计并集成智能搜索、网盘服务与跨设备同步等功能。 立即进入“☞☞☞☞☞点击夸克资源网(永久免费)入口☜☜☜☜☜”; 立即进入“☞☞☞☞☞点击夸克浏览器电脑网页版访问入口☜☜…

    2026年9月22日
    500
  • PHP一键环境如何设置网站域名解析_本地域名解析配置

    配置本地域名需修改hosts文件并设置Web服务器虚拟主机。1. 在hosts添加“127.0.0.1 myproject.test”实现域名解析;2. Apache中编辑httpd-vhosts.conf添加VirtualHost指向项目目录,确保加载该配置文件后重启服务;3. Nginx中在vh…

    2026年9月22日
    700
  • Karate框架中处理带方括号和日期范围的GET请求参数

    本文旨在解决Karate框架中构建包含复杂、带方括号(如filters[start_date])及日期范围的GET请求参数时遇到的URL编码问题。通过对比直接定义查询对象和使用param关键字的方法,详细阐述了如何正确地构造URL,确保参数格式符合预期,从而有效进行API测试。 1. 问题背景与挑战…

    2026年9月22日
    000
  • RAID 0阵列对NVMe SSD性能的提升与数据安全风险分析

    RAID 0通过多NVMe SSD并行提升读写性能,理论速度翻倍且显著优化高负载响应,但无冗余导致任一硬盘故障即全阵列崩溃,数据恢复极难,仅建议用于可接受高风险的临时工作或性能优先场景,并必须配合外部备份。 raid 0通过将数据条带化分布在多个存储设备上,理论上可提升读写性能。在搭配nvme ss…

    用户投稿 2026年9月22日
    200

发表回复

登录后才能评论
关注微信