14

为什么 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 要求我再次安装扩展程序,即使我在 2 分钟前安装了它。换句话说,即使安装了扩展,chrome.app.isInstalled 也总是返回 false。为什么?

4

3 回答 3

15

请参阅chrome.app.isInstalled 始终返回为“false”

chrome.app.isInstalled旨在供托管应用程序使用(它定义了一组包含应用程序的 URL)。扩展可以通过将 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. 如果节点存在,则内容脚本正在运行;因此,安装了扩展。如果它不存在,则假定未安装扩展。

注入 DOM 节点不会影响app.isInstalled. 相反,您检查 DOM 节点的存在作为扩展存在的证明。

于 2013-08-16T15:00:25.513 回答
6

另一种解决方案是采用externally_connectable.

由于内联安装是从经过验证的站点进行的,因此您有一个要检查扩展是否存在的设置域。比方说,example.com它的子域。

然后,您可以在清单中定义以下内容:

"externally_connectable" : {
  "matches" : [
    "*://*.example.com/*"
  ]
}

这将暴露chrome.runtime.sendMessageexample.com域。

然后,您可以在您的扩展程序中设置一个消息侦听器,该侦听器onMessageExternal将回复来自页面的“ping”

有关更多详细信息,请参阅此答案

于 2014-12-08T15:32:29.587 回答
1

找到了简单的解决方案,只影响一页

检查选项卡是否以您网站的 URL 开头,所以做一些小的 DOM 更改。

chrome.tabs.query({active: true, currentWindow: true}, function (arrayOfTabs) {
    var tab = arrayOfTabs[0];

    if ( tab.url.indexOf('http://yoursite.com') === 0 ){
        chrome.tabs.executeScript({
                code: 'document.body.classList.add("your_сlass");'
        });
    }
});
于 2016-12-04T22:17:36.203 回答