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

3

我是一个Chrome应用程序的所有者,目前这个应用程序是托管在https://mydomain.com上的托管应用。我希望添加推送消息功能,因此它必须变成一个打包的应用程序。

然而,我不想失去在网站上提示用户安装应用程序的能力,如果他们尚未安装该应用程序。

我想出了许多测试方法,但似乎没有一种是令人满意的:

  • chrome.app.isInstalled,我目前使用的方法对于打包的应用程序不可用。
  • 插入DOM元素是推荐的做法,但只适用于扩展; 对于打包应用程序,content_scripts被禁止使用。
  • 设置Cookie可能有效,但cookies权限被禁止使用于打包应用程序中。
  • 使用Webview设置cookie可能是可行的,但Webview是沙箱化的,并且不与Chrome共享cookie。
  • 检测应用程序中的文件可能有效果,但对于打包应用程序,web_accessible_resources权限被禁止使用。
  • 指定url处理程序似乎可能有效,但它们似乎仅适用于地址栏中的URL(即它们似乎不处理请求)。
  • 设置externally_connectable可以工作,但它需要一个权限对话框,表示应用程序想要“与合作网站进行通信”。即使我指定https://mydomain.com,该权限也是如此模糊。我希望避免这种情况,因为当权限更改时,人们倾向于不更新应用程序。

是否有人知道一种方法来确定我是否安装了打包的应用程序,如果我拥有应用程序和https://mydomain.com

1个回答

2

url_handlersexternally_connectable是解决问题的方法。您已经因为额外的权限警告(这将禁用应用程序,直到用户批准新权限)而可以理解地排除了最后一种选项。

url_handlers提供了一种不需要额外权限的解决方案:

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

如果以前的方法由于某些原因不适合您,那么还有一种(脆弱的)替代方案:在您的服务器上设置一个API端点并使用CORS。因为您的应用程序没有权限访问此资源,所以AJAX请求自动获得无法伪造的请求头(Origin: chrome-extension://.../...)。您可以检测到此标题的存在,并将应用标记为已安装的特定IP地址。如果选择正确的频率,您将拥有最新的IP到应用映射。
但是,这对于NAT后面的多台计算机不起作用。而且,我(作为用户)会担心我的隐私问题,如果您一直在追踪我的信息...


我还没有机会验证这个,但看起来它是正确的方向。当我尝试过后,我会回报的。 - dta

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接