【问题标题】:Detect if chrome is webview?检测chrome是否是webview?
【发布时间】:2016-05-25 09:55:46
【问题描述】:

有没有办法检测内容是由独立的 Chrome 还是在 web 视图中(来自 chrome 应用程序)访问的?例如

if(chromeapp) {
  //content is in a webview / chromeapp
} else {
  //all other browsers
}

也可以是 jQuery...

编辑:我正在开发一个连接到内容管理网站的 chrome 应用程序。在全局 js 文件中,我需要根据访问的位置返回不同的值。

如果桌面返回这个... 如果iOS返回这个...... 如果安卓等... 如果 chrome 应用程序...

这是一个将内容嵌入为<webview>的打包应用。

{
  "manifest_version": 2,
  "name": "...",
  "short_name": "...",
  "description": "...",
  "version": "...",
  "minimum_chrome_version": "38",
  "default_locale": "en",
  "icons": {
    "16": "...",
    "128": "...",
    "192": "...",
    "256": "...",
    "384": "...",
    "512": "..."
  },
  "app": {
    "background": {
      "scripts": ["background.js"]
    }
  },
  "permissions": [
    "<all_urls>",
    "storage",
    "system.memory",
    "system.network",
    "unlimitedStorage",
    {"fileSystem": ["write", "retainEntries", "directory"]},
    "webview",
    "downloads",
    "fullscreen"
   ],
   "webview" : {
     "partitions": [{
      "name" : "trusted*",
      "accessible_resources": ["<all_urls>"]
     }]
   },
   "sockets": {
    "tcpServer" : {
      "listen": ["*"]
    }
  }
}

【问题讨论】:

  • 你能更好地解释你的场景吗?托管应用程序?嵌入在&lt;webview&gt;?该应用程序在您的控制之下吗?您说“Chrome 应用程序”是指“Chrome 浏览器”吗?为什么需要这个?
  • @Xan 对不起。见编辑。
  • 那么你有什么样的应用程序?该网站的hosted app?还是以某种方式共享 JavaScript 的 packaged app?还是嵌入网站as &lt;webview&gt; 的打包应用程序?还是Progressive Web App?也许如果您添加应用清单会有所帮助。
  • 问题已更新。请原谅我,但我不确定这个问题有什么令人困惑的地方:导航器是 chrome 还是 chrome 应用程序中的 chrome?
  • 令人困惑的部分是“在 chrome 应用程序中”可能意味着大约 5 种不同的东西。现在问题很清楚了(“在&lt;webview&gt; 标签内”)。

标签: javascript jquery google-chrome-app browser-detection


【解决方案1】:

如果 webapp 在您的控制之下,最好更改 webapp 的用户代理或在 url 中传递一个变量,以便您的网站知道它是通过 webapp 访问的。

例如:http://ww.mywebsite.com/?app=webview

【讨论】:

  • 可能的解决方案。但我可能需要使用此解决方案更改内容,因此可能不可行。
  • 我已经为我自己的基于网络游戏的安卓应用程序使用了用户代理解决方案。如果站点检测到正常浏览器,您会收到通知,告诉您有一个应用程序,如果站点检测到应用程序用户代理,那么您将被转发到游戏。据我所知,那是当时(大约 2 年前)最好的解决方案。
【解决方案2】:

您可以做的最简单的事情是为您的 &lt;webview&gt; 覆盖 User-Agent。

// App window code
webviewElement.setUserAgentOverride(
  navigator.userAgent + " HeyItsMyApp/" + chrome.runtime.getManifest().version
);
webviewElement.src = "https://example.com"; // Initiate navigation

// webpage code
if (navigator.userAgent.indexOf("HeyItsMyApp") >= 0) {
  // It's embedded in our app
}

或者,您可以通过accessible_resources 测试您的应用程序中的已知文件(您目前误用了它,因为它不是 webview 内容的匹配模式列表,而是扩展程序中文件的模式列表) .例如,假设 hello.txt 在您的扩展程序中:

"webview" : {
  "partitions": [{
    "name" : "trusted*",
    "accessible_resources": ["hello.txt"]
   }]
 },

然后您可以在您的网页中尝试加载chrome-extension://youridhere/hello.txt - 它只会在您的应用中成功。

这可能是一种更防篡改的解决方案,尽管没有什么是完全防篡改的。


另外,您也可以注入一个内容脚本,用于通知页面它已嵌入,可能通过添加一些不可见的 DOM 元素。

【讨论】:

  • 好主意,但我似乎无法设置代理。没有收到任何错误,我在 createdWindow 上设置了这个
  • 您需要显示代码(单独的问题?),但请考虑使用我的代码,您的 webview 应该具有 src 最初未设置。
  • 我明白了.. 我今天晚些时候需要回到这个问题。
  • 我无法让它工作。虽然这样做会更好,但我最终还是通过应用程序传递了一个变量。
猜你喜欢
  • 2013-11-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-09-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多