【问题标题】:Detect android webview检测android webview
【发布时间】:2015-08-06 06:30:27
【问题描述】:

我有一个html-javascript 页面,我需要检测它何时在 web 视图中打开(如在 facebook webview、twitter webview 等内部),如果它是 webview - 显示其他内容。

注意:我不控制第三方 Android 应用,因此我无法更改他们的代码。

我已经找到了一种检测 IOS webview 的方法(在 stackoverflow 上找到):

var isIosWebview =/(iPhone|iPod|iPad).*AppleWebKit(?!.*Safari)/i.test(navigator.userAgent)

现在我正在寻找可以检测 Android 网页视图的 javascript 代码。

帮助?

【问题讨论】:

  • 所以你没有找到这个并尝试一下? developer.chrome.com/multidevice/user-agent#webview_user_agent
  • 我在您附加的链接之前尝试过。 “chrome/ Mobile”存在于 webview 上,但它也存在于常规的 android 浏览器上 - 所以它没有帮助。
  • 'Version/4.0' 似乎是 Android WebView 独有的。
  • 我正在查看我检查的第一个 web 视图 (twitter) - Chrome/33.0.0.0 Mobile
  • 我知道 IFrame 仅在 Web 视图上不受支持,所以我有一个迹象 - 但我不想依赖这些信息...

标签: javascript android html webview uiwindow


【解决方案1】:

您无法仅使用用户代理字符串来检测它,因为任何使用 WebView 的应用程序都可以将 UA 字符串设置为它想要的任何内容。

如果你仍然坚持使用UA字符串,这是官方文档的解释:最初,基于Chromium的WebView使用.0.0.0作为Chrome版本后缀;在较新的版本中,; wv 被添加到 UA 字符串的平台部分。请注意,KitKat 之前的 WebViews 没有 Chrome 部分。请参阅有关此的旧帖子:Android, webview user agent vs browser user agent

WebView 参与的另一个提示是存在带有应用程序包名称的X-Requested-With HTTP 标头。注意这个header也是由XMLHttpRequest设置的,所以需要寻找header的实际值。

WebView 不支持 iframe 的说法不正确。

【讨论】:

  • 如何获得“X-Requested-With”。我查了一下,没找到好办法。
  • 在服务器上可以看到。没有办法从页面侧看到它。
  • 在flask python中,你可以做request.headers.get('X-Requested-With'),它会给你webView的包名。它帮助我阻止了在 webViews 上非法显示我的网站的应用程序。
【解决方案2】:

其他人在此线程中提供的信息为我提供了解决此问题所需的信息。对于其他人,这里是生成的 JS 正则表达式,它代表接受的答案中描述的检测:

/(Version\/\d+.*\/\d+.0.0.0 Mobile|; ?wv|(iPhone|iPod|iPad).*AppleWebKit(?!.*Safari))/i.test(navigator.userAgent)

正则表达式包括旧 Android、新 Android、iOS 版本的案例。

【讨论】:

    【解决方案3】:

    我知道该怎么做。这很简单。因为Android web view 使用了一个对象来通过javascript 触发其Android 应用程序中的功能。所以在你的js代码中你可以使用:

    if (typeof Android === "undefined") {
        // do something if is NOT a web view
    } else {
        // do something else if is a web view
    }
    

    【讨论】:

    • 谢谢!根据我最近的经验,我意识到,每当您在 javascript 中使用这样的接口对象时,您都需要执行这种类型的测试,以确保您至少可以在浏览器中测试页面的外观。
    • 这似乎对我不起作用。我已经在模拟器内的 Android Webview 中尝试过。
    • @gil.fernandes 这段代码是 JavaScript,Android 代码中没有用到
    • 试过这个。 JavaScript。在 Facebook Android webview 中对我不起作用。 (typeof Android === "undefined") 显然返回 True
    【解决方案4】:

    我需要检测浏览器是否是 Android WebView,而不使用 User-Agent(因为它可能被欺骗),并且不读取服务器端的 Headers。

    他们似乎很狡猾地隐藏了这一点,但您可以检查window 是否有一个名为"Android " 的属性(末尾有一个空格)。这似乎是 true 仅在应用内用作 WebView 时,而不是在同一设备上的 Chrome 中。

    const isAndroidWebView = window.hasOwnProperty('Android ')
    

    免责声明:我仅在运行 Android 10 的 Pixel 3 和运行 Android 9 的诺基亚 6 上验证了这一点。请评论这是否适用于您的设备。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-03-07
      • 1970-01-01
      • 1970-01-01
      • 2011-06-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多