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

如何检测用户在Safari偏好设置中启用/禁用扩展的操作

检测Safari扩展的启用/禁用状态变化

在Safari Web Extensions(Manifest V2/V3)中,你可以通过以下几种方式实时感知扩展的启用/禁用操作:

1. 利用后台脚本的生命周期事件

Safari会在扩展启用时自动启动后台脚本(Manifest V3的Service Worker或Manifest V2的背景页),在扩展禁用时终止后台脚本并触发挂起事件,这是最直接的检测方式。

代码示例(Manifest V3 Service Worker)

// service-worker.js

// 扩展启用时触发:脚本初始化阶段执行
console.log("扩展已启用");
// 这里可执行启用后的逻辑,比如更新本地存储、初始化功能等

// 扩展即将被禁用/挂起时触发
browser.runtime.onSuspend.addListener(() => {
  console.log("扩展即将被禁用");
  // 这里执行禁用前的清理操作,注意该事件执行时间有限,避免异步耗时任务
});

代码示例(Manifest V2 背景页)

// background.js

window.addEventListener('load', () => {
  console.log("扩展已启用");
  // 启用后的初始化逻辑
});

// 监听扩展挂起事件
browser.runtime.onSuspend.addListener(() => {
  console.log("扩展即将被禁用");
  // 禁用前的清理操作
});

2. 向内容脚本同步状态变化

如果需要在网页的内容脚本中感知扩展状态变化,可以通过后台脚本主动发送消息通知:

后台脚本(Service Worker)

// service-worker.js

// 扩展启动时,通知所有标签页的内容脚本
browser.runtime.onStartup.addListener(async () => {
  const tabs = await browser.tabs.query({});
  tabs.forEach(tab => {
    browser.tabs.sendMessage(tab.id, { type: "EXTENSION_ENABLED" }).catch(() => {
      // 忽略无法发送消息的标签页(如不支持内容脚本的页面)
    });
  });
});

// 扩展即将禁用时,通知所有标签页的内容脚本
browser.runtime.onSuspend.addListener(async () => {
  const tabs = await browser.tabs.query({});
  tabs.forEach(tab => {
    browser.tabs.sendMessage(tab.id, { type: "EXTENSION_DISABLED" }).catch(() => {});
  });
});

内容脚本

// content-script.js

browser.runtime.onMessage.addListener(message => {
  if (message.type === "EXTENSION_ENABLED") {
    console.log("扩展已启用");
    // 执行页面端的启用逻辑
  } else if (message.type === "EXTENSION_DISABLED") {
    console.log("扩展已禁用");
    // 执行页面端的禁用逻辑
  }
});

注意事项

  • runtime.onSuspend事件的执行窗口有限(通常仅几秒),不适合执行异步请求或耗时操作,否则可能无法完成。
  • 针对旧版Safari App Extensions(基于原生AppKit开发),可通过监听SFSafariExtensionManagerExtensionsDidChangeNotification系统通知检测状态变化,但该方式仅适用于原生扩展开发。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.21 20:48:46