[英]Detect in-app browser (WebView) with PHP / Javascript
我为 iOS 和 Android 开发了一个应用程序,它使用应用程序内浏览器 (Webview) 从我的网络服务器访问 HTML 文件。
我不希望用户可以在不使用应用程序的情况下访问此文件。 是否有可能检测到用户是使用应用程序访问文件还是直接通过此智能手机/平板电脑/计算机上的浏览器访问文件? 我认为使用 PHP 的解决方案要好得多,因为可以关闭 Javascript。 至少 Google Analytics 可以区分 Safari 和 Safari(应用内)。 它应该适用于 iOS 和 Android 的每个版本。
谢谢你的帮助。
解决方案
经过多次尝试,我终于找到了适合我的解决方案!
iOS:您可以使用用户代理检测 Safari 和应用内浏览器之间的差异。 可能有更好的解决方案,但它有效。
// Safari (in-app)
if ((strpos($_SERVER['HTTP_USER_AGENT'], 'Mobile/') !== false) && (strpos($_SERVER['HTTP_USER_AGENT'], 'Safari/') == false) {
echo 'Safari (in-app)';
}
Android:应用程序的包名称存储在 PHP 变量$_SERVER['HTTP_X_REQUESTED_WITH']
。
// Android (in-app)
if($_SERVER['HTTP_X_REQUESTED_WITH'] == "com.company.app") {
echo 'Android (in-app)';
}
正如 Tim van Elsloo 已经指出的那样,HTTP 标头可以伪造,这并不是绝对安全的。
我不确定 Android,但是当您使用 iOS SDK 的UIWebView
,它会将您的应用程序的名称和版本作为用户代理 ( YourApp/1.0
) 的一部分发送。
然后你可以使用 PHP 来检查你的应用内 webview 是否正在被使用:
if (strpos($_SERVER['HTTP_USER_AGENT'], 'YourApp/') !== false)
我认为 Android 也做了类似的事情。
解决方案代码:
$isWebView = false;
if((strpos($_SERVER['HTTP_USER_AGENT'], 'Mobile/') !== false) && (strpos($_SERVER['HTTP_USER_AGENT'], 'Safari/') == false)) :
$isWebView = true;
elseif(isset($_SERVER['HTTP_X_REQUESTED_WITH'])) :
$isWebView = true;
endif;
if(!$isWebView) :
// Android or iOS Webview
else :
// Normal Browser
endif;
对于 Android WebView,请参阅 Developer Chrome 中的链接 - https://developer.chrome.com/multidevice/user-agent#webview_user_agent
用户代理字符串中已经有可用的提示,如“Mobile”、“wv”。
你可以使用类似的东西
if (strpos($_SERVER['HTTP_USER_AGENT'], 'Mobile') !== false)
要么
if (strpos($_SERVER['HTTP_USER_AGENT'], 'wv') !== false)
检测用户是否为Android WebView。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.