You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Chrome浏览器扩展实现类iOS后端消息推送方案问询

实现Chrome扩展类iOS推送通知的几种方案

嘿,我刚好折腾过类似的需求,其实Chrome扩展生态里完全能实现你要的这种消息推送+通知展示功能,只是你可能没找对对应的API入口~下面给你梳理两种最常用的实现方式:

一、用Chrome原生的chrome.notifications API(本地触发/轮询后端)

如果你的需求是扩展处于活跃状态时接收消息并弹通知,或者可以接受定时轮询后端接口拉取消息,那这个API最直接,和iOS通知的视觉体验也很接近。

步骤:

  1. 在manifest.json里声明权限
    必须添加notifications权限,还要确保扩展有后台页面或者Service Worker(用来处理消息逻辑):

    {
      "manifest_version": 3,
      "permissions": ["notifications"],
      "background": {
        "service_worker": "background.js"
      }
    }
    
  2. 在后台脚本里创建通知
    当你从后端拿到消息后,调用chrome.notifications.create()就能弹出系统级通知,还能自定义标题、内容、图标:

    // background.js
    function showNotification(title, message) {
      chrome.notifications.create({
        type: "basic",
        iconUrl: "icons/notification-icon.png", // 替换成你的通知图标
        title: title,
        message: message,
        priority: 2 // 高优先级,类似iOS的重要通知
      });
    }
    
    // 示例:假设你通过fetch拉取后端消息
    async function fetchNewMessages() {
      const response = await fetch("你的后端消息接口");
      const data = await response.json();
      if (data.newEvent) {
        showNotification("新事件提醒", data.message);
      }
    }
    
    // 可以定时轮询,比如每5分钟查一次
    setInterval(fetchNewMessages, 5 * 60 * 1000);
    
  3. 监听通知点击事件
    如果需要用户点击通知后跳转到扩展页面或者指定网址,加上这个监听:

    chrome.notifications.onClicked.addListener((notificationId) => {
      // 打开扩展的弹窗页面
      chrome.action.openPopup();
      // 或者打开指定URL
      // chrome.tabs.create({url: "/event-detail.html"});
    });
    

二、用Chrome Push API + Service Worker(后端主动推送)

如果想要后端主动发消息,即使扩展没打开也能收到通知(类似iOS的远程推送),那就要用Chrome的Push API,这个需要结合Service Worker和Chrome的推送服务来实现。

步骤:

  1. 配置manifest权限
    除了notifications,还要加push、storage权限,并且声明gcm_sender_id(固定值103953800507,是Chrome推送服务的ID):

    {
      "manifest_version": 3,
      "permissions": ["notifications", "push", "storage"],
      "background": {
        "service_worker": "background.js"
      },
      "gcm_sender_id": "103953800507"
    }
    
  2. 让用户订阅推送
    先在扩展的前端页面(比如popup.html)里请求用户授权,然后获取订阅ID,把这个ID传给后端,后端后续就用这个ID发推送:

    // popup.js
    async function subscribePush() {
      const registration = await navigator.serviceWorker.ready;
      const subscription = await registration.pushManager.subscribe({
        userVisibleOnly: true, // 必须设为true,所有推送都要显示通知
        applicationServerKey: urlBase64ToUint8Array("你的VAPID公钥")
      });
      // 把subscription对象传给后端保存
      await fetch("你的后端订阅接口", {
        method: "POST",
        body: JSON.stringify(subscription)
      });
    }
    
    // 辅助函数:把VAPID公钥转成Uint8Array
    function urlBase64ToUint8Array(base64String) {
      const padding = '='.repeat((4 - base64String.length % 4) % 4);
      const base64 = (base64String + padding).replace(/-/g, '+').replace(/_/g, '/');
      const rawData = window.atob(base64);
      return Uint8Array.from([...rawData].map(char => char.charCodeAt(0)));
    }
    
  3. 在Service Worker里监听推送事件
    当后端发推送过来时,Service Worker会收到push事件,此时直接弹出通知:

    // background.js
    self.addEventListener("push", (event) => {
      const data = event.data?.json() || { title: "新通知", message: "有事件发生" };
      event.waitUntil(
        self.registration.showNotification(data.title, {
          body: data.message,
          icon: "icons/notification-icon.png",
          data: { url: "/event-detail.html" } // 存点击后要跳转的地址
        })
      );
    });
    
    // 监听通知点击
    self.addEventListener("notificationclick", (event) => {
      event.notification.close();
      event.waitUntil(
        clients.openWindow(event.notification.data.url)
      );
    });
    

补充说明

  • VAPID密钥需要自己生成,用来验证后端和Chrome推送服务的身份,你可以用Node.js的web-push库生成。
  • 后端发送推送时,要调用Chrome推送服务的API,把消息推送给对应的订阅ID。

小提示

  • 通知的样式可以自定义,比如添加按钮、大图等,参考chrome.notifications的官方参数。
  • 测试推送时,要确保扩展已打包或者在开发者模式下加载,并且用户已经授权通知权限。

内容的提问来源于stack exchange,提问作者IdontEvenEven

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.07 11:02:50