检查用户是否安装了 Chrome 扩展程序

我正在构建一个Chrome扩展程序,为了让整个事情按照我想要的方式工作,我需要一个外部JavaScript脚本来检测用户是否安装了我的扩展程序。

例如:用户安装我的插件,然后转到带有我的脚本的网站。该网站检测到我的扩展已安装,并相应地更新页面。

这可能吗?


答案 1

Chrome 现在可以将消息从网站发送到扩展程序。

因此,在扩展后台.js(内容.js将不起作用)添加如下内容:

chrome.runtime.onMessageExternal.addListener(
    function(request, sender, sendResponse) {
        if (request) {
            if (request.message) {
                if (request.message == "version") {
                    sendResponse({version: 1.0});
                }
            }
        }
        return true;
    });

然后,这将允许您从网站拨打电话:

var hasExtension = false;

chrome.runtime.sendMessage(extensionId, { message: "version" },
    function (reply) {
        if (reply) {
            if (reply.version) {
                if (reply.version >= requiredVersion) {
                    hasExtension = true;
                }
            }
        }
        else {
          hasExtension = false;
        }
    });

然后,您可以检查 hasExtension 变量。唯一的缺点是调用是异步的,所以你必须以某种方式解决这个问题。

编辑:如下所述,您需要向 manifest.json 添加一个条目,列出可以向您的插件发送消息的域。例如:

"externally_connectable": {
    "matches": ["*://localhost/*", "*://your.domain.com/*"]
},

2021年更新:如果未安装扩展或已禁用,将在控制台中引发以下异常。chrome.runtime.sendMessage

未选中的运行时.last错误: 无法建立连接。接收端不存在

若要解决此问题,请在回调中添加此验证sendMessage

if (chrome.runtime.lastError) {
    // handle error 
}

答案 2

我相信有一种直接的方法(直接调用扩展上的函数,或者通过使用JS类进行扩展),但是一种间接方法(直到出现更好的东西):

让您的 Chrome 扩展程序在网页上查找具有非常具体的 ID 的特定 DIV 或其他元素。

例如:

<div id="ExtensionCheck_JamesEggersAwesomeExtension"></div>

执行 a 并将 设置为扩展的版本号或其他名称。然后,您可以读取该客户端的内容。getElementByIdinnerHTML

同样,如果有可用的直接方法,则应使用直接方法。


编辑:直接方法找到!!

使用此处找到的连接方法:https://developer.chrome.com/extensions/extension#global-events

未经测试,但你应该能够做到...

var myPort=chrome.extension.connect('yourextensionid_qwerqweroijwefoijwef', some_object_to_send_on_connect);