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

时间:2013-05-05 10:56:04

标签: php javascript android ios xcode

我为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)';
}

机器人: 应用程序中的包名称存储在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标头可能是伪造的,这不是绝对安全的。

3 个答案:

答案 0 :(得分:5)

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

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

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

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

答案 1 :(得分:4)

解决方案代码:

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

答案 2 :(得分:0)

对于Android WebView,请参阅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。