如何检测我的Chrome打包应用程序是否已安装?

时间:2014-04-11 18:04:30

标签: push-notification chrome-web-store google-chrome-app

我是Chrome应用的所有者,该应用目前是https://mydomain.com上的托管应用。我想向它添加推送消息,因此它必须成为一个打包的应用程序。

但是,我不想失去提示网站上的用户安装应用程序的能力,如果他们还没有安装它。

我有很多方法来测试这个,但是没有一个看起来令人满意:

  • chrome.app.isInstalled ,我目前使用的方法不适用于打包的应用。
  • 插入DOM元素是推荐的做法,但仅适用于扩展程序;对于打包的应用,我们不允许使用content_scripts
  • 设置Cookie 可能有效,但打包的应用不允许cookies权限。
  • 使用网页浏览设置Cookie 可能是可行的,但网页浏览是沙盒的,不与Chrome共享Cookie。
  • 检测应用中的文件可能有效,但不允许对打包的应用授予web_accessible_resources权限。
  • 指定url handlers 似乎可能有效,但看起来它们只适用于地址栏中的网址(即它们似乎无法处理请求)。
  • 设置externally_connectable 有效,但需要一个权限对话框,说该应用程序希望“与合作网站进行通信”。即使我指定https://mydomain.com,权限也是如此模糊。我想避免这种情况,因为人们在权限更改时往往不会更新应用。

如果我同时拥有该应用和https://mydomain.com,是否有人知道如何确定我的打包应用是否已安装?

1 个答案:

答案 0 :(得分:2)

url_handlersexternally_connectable是可行的方法。由于额外的权限警告(在用户批准新权限之前会禁用该应用程序),您可以理解地排除了最后一个选项。

url_handlers确实提供了解决方案而无需额外的权限:

  1. 在您的服务器方面,如果用户没有任何Cookie,请重定向到您服务器上的其他某个网址。例如。 http://example.com/landing/ - > http://example.com/landing/?noapp
  2. 如果未安装该应用,则会遵循重定向。在该着陆页上,使用history.replaceState(null, null, '/landing/');将网址更改回原始网址。
  3. 如果安装了该应用,则会触发chrome.app.runtime.onLaunched,并且不会遵循重定向。在您的网站上,使用setTimeout检查页面是否已卸载。

  4. 如果之前的方法由于某种原因不适合您,那么还有一个(脆弱的)替代方法:在您的服务器上设置API端点并使用CORS。由于您的应用没有访问此资源的权限,因此AJAX请求会自动获取不可伪造的请求标头(Origin: chrome-extension://.../...)。您可以检测此标头的存在,并将应用标记为已安装的特定IP地址。如果您选择正确的频率,您将拥有最新的ip-to-app映射 但这并不适用于NAT后面的多台计算机。如果你不断回家,我(作为用户)会担心我的隐私......