【问题标题】:How can I detect if my chrome packaged app is installed?如何检测我的 chrome 打包应用程序是否已安装?
【发布时间】:2014-04-11 18:04:30
【问题描述】:

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

但是,如果用户尚未安装应用,我不想失去在网站上提示用户安装应用的能力。

我想出了很多方法来对此进行测试,但似乎没有一个令人满意:

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

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

【问题讨论】:

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


    【解决方案1】:

    url_handlersexternally_connectable 是要走的路。您可以理解地排除了最后一个选项,因为额外的权限警告(在用户批准新权限之前会禁用应用程序)。

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

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

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

    【讨论】:

    • 我还没有机会验证这一点,但它看起来是在正确的轨道上。当我尝试这个时我会报告。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多