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

Safari中Content Script一段时间后停止接收Background Script消息的问题

问题

我开发了一个用于控制music.yandex.by网站音乐播放的浏览器扩展。用户点击popup按钮时,我通过Background Script向Content Script传递消息,音乐播放时一切正常,但停止播放并切换到其他标签页后,约5分钟Content Script就会停止接收消息,而Background Script仍能正常工作。

我的manifest文件如下:

{
    "manifest_version": 2,
    "default_locale": "en",

    "name": "__MSG_extension_name__",
    "description": "__MSG_extension_description__",
    "version": "1.0",

    "content_scripts": [{
        "js": [ "content.js" ],
        "matches": [
            "*://music.yandex.by/*"
        ]
    }],
    
    "background": {
        "scripts": ["background.js"],
        "persistent": true
    },
    
    "web_accessible_resources": [
      "images/my-image.png"
    ],
    
    "action": {
        "default_icon": "toolbarItemIcon.pdf",
        "default_title": "Открыть Яндекс Музыку"
    },
    
    "externally_connectable": {
        "matches": [
            "*://music.yandex.by/*"
        ]
    },

    "permissions": [
        "nativeMessaging",
        "*://music.yandex.by/*"
    ]
}

我用Port实现Background与Content Script的通信,推测是非活跃页面进入待机模式导致Content Script被禁用,请问有什么方法可以绕过这一限制?

解决方案

针对非活跃标签页休眠导致Content Script失效的问题,可尝试以下几种实用方法:

方法1:跳过Content Script,直接在Background中操作标签页DOM

既然Content Script会被休眠回收,直接通过Background Script主动注入代码执行控制逻辑,无需维持长连接:

  • 先通过chrome.tabs.query定位到music.yandex.by的目标标签页,再用chrome.tabs.executeScript注入临时代码触发播放/暂停等操作。
  • 示例代码(background.js):
// 触发播放的逻辑,根据Yandex音乐实际DOM结构调整选择器
chrome.tabs.query({url: "*://music.yandex.by/*"}, (tabs) => {
  if (tabs.length > 0) {
    chrome.tabs.executeScript(tabs[0].id, {
      code: `
        const playBtn = document.querySelector('.player-controls__btn_play');
        if (playBtn) playBtn.click();
      `
    });
  }
});

这种方式每次操作都会主动唤醒标签页执行代码,不受休眠影响。

方法2:改用短消息通信替代Port长连接

放弃Port长连接,使用一次性短消息传递指令:

  • 在Content Script中监听chrome.runtime.onMessage事件,Background Script需要发送控制指令时,用chrome.runtime.sendMessage指定目标标签页ID发送消息。
  • 短连接每次发送都会尝试唤醒Content Script,比长连接更适配单次控制的场景,稳定性更高。

方法3:定期唤醒标签页避免休眠

利用已设置的persistent: true后台页,定期向目标标签页注入无操作代码,维持活跃状态:

  • 每隔3-4分钟执行一次chrome.tabs.executeScript,注入一段空代码或简单的DOM检查逻辑,让标签页保持活跃,防止Content Script被回收。
  • 注意控制频率,避免过度占用资源。

方法4:操作前先唤醒标签页

在需要发送控制指令前,先通过chrome.tabs.executeScript注入一段轻量代码唤醒标签页,再执行后续操作:

  • 比如先注入console.log('wake up')这类无影响的代码,确保Content Script处于活跃状态后,再发送控制消息或执行操作。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.14 03:44:52