使用 PHP / Javascript 检测应用内浏览器 (WebView)

Posted

技术标签:

【中文标题】使用 PHP / Javascript 检测应用内浏览器 (WebView)【英文标题】:Detect in-app browser (WebView) with PHP / Javascript 【发布时间】:2013-04-29 07:47:45 【问题描述】:

我为 iosandroid 开发了一个应用程序,它使用应用程序内浏览器 (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)';

安卓: 应用程序的包名称存储在 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 标头可以被伪造,这并不是绝对安全的。

【问题讨论】:

如果从其他浏览器打开页面,iOs 解决方案将失败。经过一些测试,我对其进行了一些改进。在这里查看:***.com/questions/2738766/… 这个方法对 IOS11 是否仍然有效,因为在 IOS 11 中,即使在应用程序浏览器中,我们也会返回包含 Safari 单词的 HTTP_USER_AGENT 值。我们得到了这个:Mozilla/5.0(iPhone;CPU iPhone OS 11_3,如 Mac OS X)AppleWebKit/605.1.15(KHTML,如 Gecko)版本/11.0 Mobile/15E148 Safari/604.1 用于应用程序 safari。所以我假设这个方法将不再适用于IOS11? 【参考方案1】:

我不确定 Android,但是当您使用 iOS SDK 的 UIWebView 时,它会将您的应用程序的名称和版本作为用户代理 (YourApp/1.0) 的一部分发送。

然后您可以使用 PHP 来检查您的应用内 web 视图是否正在使用:

if (strpos($_SERVER['HTTP_USER_AGENT'], 'YourApp/') !== false)

我认为 Android 也做了类似的事情。

【讨论】:

请注意,这显然也可以被桌面浏览器伪造(通过设置“假”HTTP 标头),因此从安全角度来看,您不应该依赖它。 感谢您的快速帮助。不幸的是,用户代理不包括应用程序名称。至少在我的尝试中没有。 你在使用UIWebView吗?它应该类似于:<AppName>/1.0 CFNetwork/459 Darwin/10.2.0。如果不是(我怀疑),那么您总是可以尝试做类似***.com/questions/478387/… 或***.com/questions/8487581/… 的事情。 是的,我正在使用 UIWebView,我尝试了一些,但我的应用程序没有出现在用户代理中。我什至用 Xcode 的 iOS 模拟器尝试过它,只得到类似(来自 iPhone 6.1 模拟器):Mozilla/5.0 (iPhone; CPU iPhone OS 6_1 like Mac OS X) AppleWebKit/536.26 (KHTML, like Gecko) Mobile/10B141 也许 PHP 变量 $_SERVER['HTTP_USER_AGENT'] 不是对吗?【参考方案2】:

解决方案代码:

$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;

【讨论】:

【参考方案3】:

对于 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。

【讨论】:

以上是关于使用 PHP / Javascript 检测应用内浏览器 (WebView)的主要内容,如果未能解决你的问题,请参考以下文章

PHP 未检测到来自 JavaScript 请求的 POST JSON 数据

如何使用javascript或php检测窗口关闭事件[重复]

通过 javascript 检测 ipad/iphone webview

如何通过 php/ajax/javascript 动态检测蜂窝运营商? [关闭]

如何在javascript中检测鼠标加速?

检测 Android 和 iOS Webviews