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

oab*_*rca 13 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">
Run Code Online (Sandbox Code Playgroud)

以下是单击按钮时执行的一些Javascript:

if (!chrome.app.isInstalled) {
 alert('extension is about to be installed!');
 install_extension();
}else{
  alert('extension is installed already.');
}
Run Code Online (Sandbox Code Playgroud)

我第一次点击按钮时,Google Chrome会问我是否要安装扩展程序.我同意并且扩展程序已正确安装.当我刷新页面时,我再次点击了按钮,Google CHrome要求我再次安装扩展程序,即使我在2分钟前安装它也是如此.换句话说,即使安装了扩展名,chrome.app.isInstalled也始终返回false.为什么?

aps*_*ers 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节点作为扩展存在的证据.

  • 原来如此.我希望在文档中更清楚.但是,我仍然认为Chrome应该具有类似chrome.ext.isInstalled的功能,以便更轻松 (7认同)

Xan*_*Xan 6

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

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

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

"externally_connectable" : {
  "matches" : [
    "*://*.example.com/*"
  ]
}
Run Code Online (Sandbox Code Playgroud)

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

然后,您可以onMessageExternal在您的扩展中设置一个消息侦听器,它将从页面回复"ping".

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