检测Android WebView

8
我有一个涉及html-javascript的页面,我需要检测每当它在web视图中打开(例如Facebook Webview、Twitter Webview等),并且如果它是Webview,显示另一个内容。
注意:我无法控制第三方Android应用程序,因此无法更改它们的代码。
我已经找到了一种检测IOS Webview的方法(在stackoverflow上找到):
var isIosWebview =/(iPhone|iPod|iPad).*AppleWebKit(?!.*Safari)/i.test(navigator.userAgent)
现在我正在寻找一种可以检测Android Webview的javascript代码。
帮助吗?

那么你没有找到这个并尝试一些东西吗?https://developer.chrome.com/multidevice/user-agent#webview_user_agent - Morrison Chang
我之前尝试过你提供的链接。"chrome/<version> Mobile" 存在于 webview 上,但它也存在于普通的安卓浏览器上 - 所以这并没有帮助到我。 - Megi Ben Nun
“Version/4.0” 似乎是 Android WebView 特有的。 - Morrison Chang
我正在使用第一个我检查的Webview(Twitter)- Chrome / 33.0.0.0 Mobile。 - Megi Ben Nun
我知道IFrame只在Web视图上不受支持,所以我有一个指示 - 但我不想依赖这个信息... - Megi Ben Nun
4个回答

8
只使用用户代理字符串是无法检测到它的,因为任何使用 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 标头和应用程序包名称。请注意,XMLHttpRequest 也会设置此标头,因此您需要查找标头的实际值。
声称 WebView 不支持 iframe 是不正确的。

我该如何获取“X-Requested-With”?我查了一下,没有找到一个好的方法来获取它。 - Megi Ben Nun
您可以在服务器上看到它。无法从页面端查看。 - Mikhail Naganov
1
在 Flask Python 中,您可以执行 request.headers.get('X-Requested-With'),它将为您提供 WebView 的包名称。它帮助我阻止那些在 WebView 上非法显示我的网站的应用程序。 - scottydelta

5

在这个帖子中他人提供的信息让我能够解决我的问题。对于其他人,这里是描述被接受答案中所述检测的结果JS正则表达式:

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

正则表达式包括旧版 Android、新版 Android 和 iOS 版本的情况。

我刚刚将这个答案复制粘贴到我们的PWA中的Web视图检测钩子中。但它似乎无法检测旧的Android手机,在我的Nexus 5X,Android 8.1.0上进行了测试。似乎在用户代理字符串中包含方便的"wv"之前的所有内容都不会被检测到。对此有任何意见或建议吗? - Operator

0

我知道怎么做。这很简单。因为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
}

1
谢谢!从我的最近经验中,我意识到,每当您在JavaScript中使用这样的接口对象时,您都会想要执行此类型的测试,以确保您至少可以在浏览器中测试页面的外观。 - Papa Smurf
这对我似乎不起作用。我已经在模拟器内的Android Webview中尝试过了。 - gil.fernandes
@gil.fernandes 这段代码是 JavaScript,不用于 Android 代码。 - silvanasono
尝试过这个。JavaScript。在 Facebook Android webview 中对我不起作用。 (typeof Android === "undefined") 显然返回 True - Joshua Wolff

-1

我需要检测浏览器是否为Android WebView,但不能使用User-Agent(因为它可能被伪造),也不能在服务器端读取Headers。

他们似乎非常狡猾地隐藏了这一点,但是您可以检查window是否具有名为"Android "(末尾有空格)的属性。仅当作为应用程序内的WebView使用时,才会出现这种情况,而在同一设备上的Chrome中则不会。

const isAndroidWebView = window.hasOwnProperty('Android ')

免责声明:此操作仅在搭载 Android 10 的 Pixel 3 和搭载 Android 9 的 Nokia 6 上进行过测试。如在其他设备上无法正常运行,请留言反馈。


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