chrome.app.isInstalled对于Google Chrome扩展程序始终返回false?

时间:2013-08-16 14:42:00

标签: google-chrome google-chrome-extension

为什么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。为什么?

2 个答案:

答案 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的后半部分)。

该链接描述了测试您的扩展程序是否已安装的策略:

  1. 让内容脚本将DOM节点注入每个页面。此节点应具有非常具体的ID,例如<div id='my-extension-installed-with-id-sdgdthsdfgdtyjufwknsdkos'>

  2. 按下按钮,让页面测试该节点是否存在。

  3. 如果节点存在,则内容脚本正在运行;因此,扩展已安装。如果它不存在,则假设未安装扩展名。

  4. 注入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