在 Android 浏览器或 WebView 内部检测

Posted

技术标签:

【中文标题】在 Android 浏览器或 WebView 内部检测【英文标题】:Detect inside Android Browser or WebView 【发布时间】:2011-10-10 14:57:31 【问题描述】:

javascript 如何检测网站是在 android 的股票浏览器中加载还是在另一个应用程序的 WebView 中加载?我想在这两种情况下运行稍微不同的代码。

【问题讨论】:

检查 webview 用户代理是否与 Android 库存浏览器有任何不同。您可以通过访问此站点轻松检查它。 whatsmyuseragent.com 但是我相当肯定用户代理会完全一样,在这种情况下我不知道。 除非您是相关 WebView 的创建者。在这种情况下,我认为您可以为用户代理添加任何您想要的内容 如果您负责应用程序,您是否可以在加载页面时发送特定的用户代理,然后使用上面 Caimen 的建议?使用WebView's setUserAgentString函数,你可以设置一个特定的用户代理,然后使用javascript来检测差异。 我是使用 WebView 的应用程序的作者。我希望有一种方法可以在不编写额外代码的情况下检测它,但这是临时解决方案:this.webView.getSettings().setUserAgentString(this.webView.getSettings().getUserAgentString() + getString(R.string.user_agent_suffix)); 其中 user_agent_suffix 是“AppName/1.0”。我希望这符合用户代理字符串标准。 【参考方案1】:

Activity -> onCreate

this.webView.getSettings().setUserAgentString(
    this.webView.getSettings().getUserAgentString() 
    + " "
    + getString(R.string.user_agent_suffix)
);

Res -> Values -> strings.xml

<string name="user_agent_suffix">AppName/1.0</string>

Javascript

function() isNativeApp 
    return /AppName\/[0-9\.]+$/.test(navigator.userAgent);

【讨论】:

这是developer.android.com/guide/webapps/…官方推荐的方式 @MarvinEmilBrach 如果您在 web 视图中使用社交媒体身份验证,则该功能不起作用。它将失去Javascript接口 这只有在你也是Android应用开发者的情况下才可行,但如果你不能更改页面运行所在的应用源代码,它就行不通。当然,除非您联系应用开发者并且他们同意为您更改 Android 代码。【参考方案2】:

您可以检查所请求页面上的服务器变量,以查看它是否来自您的应用并相应地设置一个 javascript 变量

if($_SERVER['HTTP_X_REQUESTED_WITH'] == "com.company.app")
    echo 'var isAndroidApp=true;';
else
    echo 'var isAndroidApp=false;';
将 com.company.app 替换为您的包名

【讨论】:

这有时不可靠吗?【参考方案3】:

在较新版本的 WebView、Lollipop 及以上版本中,您可以通过查找用户代理字符串中的 wv 字段来区分 WebView:

Mozilla/5.0 (Linux; Android 5.1.1; Nexus 5 Build/LMY48B; wv) AppleWebKit/537.36 (Khtml, like Gecko) Version/4.0 Chrome/43.0.2357.65 Mobile Safari/537.36

https://developer.chrome.com/multidevice/user-agent#webview_user_agent

【讨论】:

以上是关于在 Android 浏览器或 WebView 内部检测的主要内容,如果未能解决你的问题,请参考以下文章

android webview

android webview或浏览器不会在设备重启时删除会话cookie

关于Android WebView的那些事

WebView的基本使用

如何在 Android 上使用 Xamarin WebView 下载本机浏览器等文件?

Android WebView 已开始在 Android 9 上崩溃