如何检测用户在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
相关产品推荐
相关产品推荐

