需要一个外部JavaScript脚本
来检测用户是否安装了我的扩展程序。
一、
Chrome现在可以将邮件从网站发送到扩展程序。
所以在扩展background.js(content.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/*"]
},
二、
我确信有一种直接的方法(直接调用扩展中的函数,或者使用扩展的JS类),但是间接方法(直到更好的方式出现):
让您的Chrome扩展程序在页面上查找特定的DIV或其他元素,并使用非常具体的ID。
例如:
<div id="ExtensionCheck_JamesEggersAwesomeExtension"></div>
执行getElementById并将innerHTML设置为您的分机的版本号或其他内容。 然后,您可以阅读该客户端的内容。
直接方法:
var myPort=chrome.extension.connect('yourextensionid_qwerqweroijwefoijwef', some_object_to_send_on_connect);
三、
公开Web可访问资源,但这将允许任何网站测试您的扩展是否已安装
假设您的扩展程序ID为runtime.getURL()
,并在扩展程序的文件中添加文件(例如,透明像素图像)为test.png。
然后,使用runtime.getURL()
清单键将此文件公开到网页:
// 在manifest.json里
"web_accessible_resources": [
"test.png",
"icon/*" // 可以访问icon文件夹下所有文件
],
在您的网页中,您可以尝试通过其完整URL
(在runtime.getURL()
标记中,通过XHR或以任何其他方式)加载此文件:
chrome-extension://aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa/test.png
如果文件加载,则安装扩展。 如果加载此文件时出错,则表示未安装扩展程序。
// Code from https://groups.google.com/a/chromium.org/d/msg/chromium-extensions/8ArcsWMBaM4/2GKwVOZm1qMJ
function detectExtension(extensionId, callback) {
var img;
img = new Image();
img.src = "chrome-extension://" + extensionId + "/test.png";
img.onload = function() {
callback(true);
};
img.onerror = function() {
callback(false);
};
}
值得注意的是:如果加载此文件时出错,则表示网络堆栈错误将出现在控制台中,不可能使其静音。 当Chromecast
使用这种方法时,由于这个原因引起了相当多的争议; 最简单的解决方案是将Chrome团队完全将Dev Tools中的特定错误列入黑名单。
重要说明:此方法在Firefox WebExtensions
中不起作用。 Web可访问资源固有地将扩展名暴露给指纹识别,因为通过知道ID可以预测URL。 Firefox决定通过为Web可访问资源分配特定于实例的随机URL来关闭该漏洞:
然后可以使用以下URL访问这些文件:
runtime.getURL()
此UUID是为每个浏览器实例随机生成的,不是您的扩展程序ID。 这可以防止网站对用户安装的扩展名进行指纹识别。
但是,虽然扩展程序可以使用runtime.getURL()来获取此地址,但您无法在您的网站中对其进行硬编码。