How can Javascript detect whether a website is loaded in Android's stock browser or loaded in a WebView of another app? I would like to run slightly different code in these two cases.
Detect inside Android Browser or WebView
Asked Answered
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);
}
That's the official recommended way from developer.android.com/guide/webapps/… –
Psych
@MarvinEmilBrach that does not work if you are using social media auth in the webview. It will lose the Javascript interface –
Maidenhead
This is viable only when you are also the Android app developer, but it won't work if you can't change the app source code in which the page will be running. Unless, of course, if you contact the app developers and they agree to make the changes in the Android code for you. –
Shovelboard
I am getting this in webview: ``` navigator.userAgent 'Mozilla/5.0 (Linux; Android 13; SM-G781B Build/TP1A.220624.014; wv) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/115.0.5790.166 Mobile Safari/537.36' ``` 😅 –
Kempe
You can check the server variables on the page that is being requested to see if it is coming from your app and set a javascript variable accordingly
if($_SERVER['HTTP_X_REQUESTED_WITH'] == "com.company.app")
echo 'var isAndroidApp=true;';
else
echo 'var isAndroidApp=false;';
- replace com.company.app with your package name
Any chance that this isn't reliable sometimes? –
Samurai
In the newer versions of WebView, Lollipop and above, you can differentiate the WebView by looking for the wv field in user agent string:
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
© 2022 - 2024 — McMap. All rights reserved.
this.webView.getSettings().setUserAgentString(this.webView.getSettings().getUserAgentString() + getString(R.string.user_agent_suffix));
where user_agent_suffix is " AppName/1.0". I hope that's compliant with the user agent string standards. – Prescriptive