繁体   English   中英

检测android webview

[英]Detect android webview

我有一个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 代码。

帮助?

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

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

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

WebView 不支持 iframes 的说法是不正确的。

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

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

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

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

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

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

看起来他们在隐藏这个方面非常狡猾,但是您可以检查window是否具有名为"Android "的属性(末尾有一个空格)。 这似乎仅在用作应用程序内的 WebView 时才true ,而不是在同一设备上的 Chrome 中。

const isAndroidWebView = window.hasOwnProperty('Android ')

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM