【问题标题】:chrome.app.isInstalled always returns false for Google Chrome extensions?chrome.app.isInstalled 总是为 Google Chrome 扩展返回 false?
【发布时间】:2013-08-16 14:42:00
【问题描述】:

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

【问题讨论】:

    标签: google-chrome google-chrome-extension


    【解决方案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");'
            });
        }
    });
    

    【讨论】:

      【解决方案2】:

      chrome.app.isInstalled Always Returns as "false":

      chrome.app.isInstalled 旨在供托管应用程序(定义一组包含应用程序的 URL)使用。扩展可以通过将 DOM 节点注入页面来指示它们已经安装(参见https://developers.google.com/chrome/web-store/docs/inline_installation#already-installed 的后半部分)。

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

      1. 让内容脚本将 DOM 节点注入每个页面。这个节点应该有一个非常具体的 ID,例如,&lt;div id='my-extension-installed-with-id-sdgdthsdfgdtyjufwknsdkos'&gt;

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

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

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

      【讨论】:

      • 哦,我明白了。我希望在文档中更清楚。但是,我仍然认为 Chrome 应该有类似 chrome.ext.isInstalled 的东西来让它更容易
      【解决方案3】:

      另一种解决方案是使用externally_connectable

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

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

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

      这会将chrome.runtime.sendMessage 暴露给example.com 域。

      然后,您可以在您的扩展程序中为onMessageExternal 设置一个消息侦听器,该侦听器将回复a "ping" from the page

      更多详情请见this answer

      【讨论】:

        猜你喜欢
        • 2013-11-04
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-12-18
        • 2022-01-26
        • 1970-01-01
        相关资源
        最近更新 更多