简介
在标准 Chrome 扩展中,Service Worker 不能持久化,这对拦截数据或长期维护状态至关重要的场景提出了挑战。本文探讨了克服此限制的各种方法。
漏洞利用 (Chrome 110)
Chrome 110 存在一个允许服务工作线程的 bug通过调用任何异步 Chrome 保持活动状态延长 30 秒API。
// background.js const keepAlive = (i => state => { if (state && !i) { if (performance.now() > 20e3) chrome.runtime.getPlatformInfo(); i = setInterval(chrome.runtime.getPlatformInfo, 20e3); } else if (!state && i) { clearInterval(i); i = 0; } })(); async function doSomething() { try { keepAlive(true); const res = await (await fetch('........')).text(); // ........... } catch (err) { // .......... } finally { keepAlive(false); } }
离屏 API (Chrome 109 )
此 API 允许创建离屏文档,每 30 秒发送一次消息,以保持 Service Worker 处于活动状态。
background.js:
async function createOffscreen() { await chrome.offscreen.createDocument({ url: 'offscreen.html', reasons: ['BLOBS'], justification: 'keep service worker running' }).catch(() => {}); } chrome.runtime.onStartup.addListener(createOffscreen); createOffscreen();
NativeMessaging API (Chrome 105 )
连接到 nativeMessaging通过 chrome.runtime.connectNative 进行主机保持 Service Worker 运行只要连接处于活动状态。
// background.js const connect = () => { chrome.runtime.connectNative('nativemessaging_host').onDisconnect.addListener(connect); }; connect(); // Start the connection on startup
WebSocket API (Chrome 116)
每 30 秒交换一次 WebSocket 消息可以使服务工作线程保持活动状态。
专注选项卡
打开一个专用选项卡,其中包含用作持久后台页面的扩展页面。
以上是如何保持 Chrome 扩展的 Service Worker 持久性?的详细内容。更多信息请关注PHP中文网其他相关文章!