Chrome扩展安装后钩子/API函数:它存在吗?

woobm2wo  于 2023-05-04  发布在  Go
关注(0)|答案(2)|浏览(131)

是否有一个Chrome扩展安装后钩子/API函数,可以让我在安装或更新插件后执行操作?
我想在安装扩展后执行操作,并且只能在安装后立即执行。此操作只应在扩展中执行一次(安装后或更新后)。

更新

有些人建议在localStorage中设置扩展的版本,我遇到的问题是,当插件首次安装时,可以访问localStorage的内容脚本没有加载到页面中。
AFAIK插件安装后,它使用注入到标签/页面的内容脚本,页面必须重新加载。
我不知道如何从后台页面访问localStorage;localStorage只能从内容脚本访问。
从后台页面到内容脚本获取版本号需要使用chrome API函数执行脚本:
chrome.tabs.executeScript(null, {code:function_to_execute}, function() { // callback });
但是,当您安装插件时,该插件需要注入内容脚本的页面已经加载,它不会注入内容脚本,您必须重新加载页面。

更新2

查看更详细的一些提示,为了保存版本号,可以访问后台页面的localStorage。然而,对于我需要做的事情,即在安装或更新插件后重新加载特定URL的特定选项卡(以确保内容脚本是最新版本),最终没有必要麻烦localStorage。
为了保持主题,给出的关于将版本号写入localStorage(在后台页面中)然后检查清单文件中的版本号的建议足以让某人在第一次安装或更新脚本时运行它。

使用方法

使清单文件可用于后台页面(注意:这是从别的地方拿来的,我不居功,但我不记得来源,如果你知道,让我知道,我会添加它)。

// MAKE MANIFEST FILE AVAILABLE
chrome.manifest = (function() {
    var manifestObject = false;
    var xhr = new XMLHttpRequest();
    xhr.onreadystatechange = function() {
        if (xhr.readyState == 4) {
            manifestObject = JSON.parse(xhr.responseText);
        }
    };
    xhr.open("GET", chrome.extension.getURL('/manifest.json'), false);
    try {
        xhr.send();
    } catch(e) {
        console.log('Couldn\'t load manifest.json');
    }
    return manifestObject;
})();

现在您可以像这样访问您的版本号:chrome.manifest.version
要写入localStorage,只需像这样传入:localStorage['my_plugin_version'] = chrome.manifest.version

xxslljrj

xxslljrj1#

您可以使用background page来完成此操作。当安装扩展时,在后台打开后台页面,并因此执行。为了确保它不会每次都被执行,只需在localStorage中存储一个值。

new9mtju

new9mtju2#

截至2023年,当我写这篇文章时,chrome.runtime中提供的onInstalled事件是最可靠的方法。

chrome.runtime.onInstalled.addListener(
  callback: function,
)

根据onInstalled的文档:
onInstalled fired when the extension is first installed, when the extension is updated to a new version, and when Chrome is updated to a new version.
你可以通过检查回调参数中的reason [chrome.runtime.OnInstalledReason]来进一步改进你的逻辑。它指定它是installupdatechrome_update还是shared_module_update
下面是一个示例代码,您可以尝试(只需将其粘贴到后台脚本中)

chrome.runtime.onInstalled.addListener((detail)=>{
    if (detail.reason === chrome.runtime.OnInstalledReason.UPDATE) {
      console.log("Hello, I have just been updated!");
    }
  }
);

相关问题