为什么chrome.app.isInstalled对于Google Chrome扩展程序始终返回false?
动态地我在页面加载时添加了一个链接元素:
<link type="text/css" rel="chrome-webstore-item" href="https://chrome.google.com/webstore/detail/itemID">
以下是单击按钮时执行的一些Javascript:
if (!chrome.app.isInstalled) {
alert('extension is about to be installed!');
install_extension();
}else{
alert('extension is installed already.');
}
我第一次点击该按钮时,Google Chrome会问我是否要安装该扩展程序。我同意并且扩展程序已正确安装。当我刷新页面时,我再次点击了按钮,Google CHrome要求我再次安装扩展程序,即使我在2分钟前安装它也是如此。 换句话说,即使安装了扩展程序,chrome.app.isInstalled也始终返回false。为什么?
答案 0 :(得分:15)
请参阅chrome.app.isInstalled Always Returns as "false":
chrome.app.isInstalled
适用于托管应用(用于定义包含该应用的一组网址)。扩展可以通过将DOM节点注入页面来指示它们已经安装(参见https://developers.google.com/chrome/web-store/docs/inline_installation#already-installed的后半部分)。
该链接描述了测试您的扩展程序是否已安装的策略:
让内容脚本将DOM节点注入每个页面。此节点应具有非常具体的ID,例如<div id='my-extension-installed-with-id-sdgdthsdfgdtyjufwknsdkos'>
按下按钮,让页面测试该节点是否存在。
如果节点存在,则内容脚本正在运行;因此,扩展已安装。如果它不存在,则假设未安装扩展名。
注入DOM节点不会影响app.isInstalled
的状态。相反,您检查是否存在DOM节点作为扩展存在的证据。
答案 1 :(得分:6)
另一种解决方案是使用externally_connectable
。
由于内联安装是从经过验证的站点进行的,因此您有一个设置域,您要在该域上检查该扩展名是否存在。我们来说,example.com
及其子域名。
然后,您可以在清单中定义以下内容:
"externally_connectable" : {
"matches" : [
"*://*.example.com/*"
]
}
这会将chrome.runtime.sendMessage
公开给example.com
域。
然后,您可以在您的扩展程序中为onMessageExternal
设置一个回复a "ping" from the page的邮件侦听器。
有关详细信息,请参阅this answer。