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

ohh*_*ahh 18 javascript php xcode android ios

我为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)';
}
Run Code Online (Sandbox Code Playgroud)

Android: 应用程序中的包名称存储在PHP变量中$_SERVER['HTTP_X_REQUESTED_WITH'].

// Android (in-app)
if($_SERVER['HTTP_X_REQUESTED_WITH'] == "com.company.app") {
    echo 'Android (in-app)';
}
Run Code Online (Sandbox Code Playgroud)

正如Tim van Elsloo已经注意到HTTP标头可以伪造,这不是绝对安全的.

Ale*_*aur 6

解决方案代码:

$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;
Run Code Online (Sandbox Code Playgroud)


els*_*ooo 5

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

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

if (strpos($_SERVER['HTTP_USER_AGENT'], 'YourApp/') !== false)
Run Code Online (Sandbox Code Playgroud)

我认为Android也做类似的事情.

  • 是的,我正在使用UIWebView,我尝试了一下,我的应用程序没有出现在用户代理中.我甚至尝试使用Xcode的iOS模拟器,只得到(来自iPhone 6.1模拟器):Mozilla/5.0(iPhone; CPU iPhone OS 6_1,如Mac OS X)`AppleWebKit/536.26(KHTML,如Gecko)Mobile/10B141`也许PHP变量`$ _SERVER ['HTTP_USER_AGENT']`不正确? (3认同)
  • 谢谢你的快速帮助.不幸的是,用户代理不包含应用名称.至少不是我的尝试. (2认同)