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

我为iOS和Android开发了一个应用程序,它使用应用内浏览器(Webview)从我的网络服务器访问HTML文件。

我不希望用户在不使用该应用程序的情况下访问此文件。 如果用户使用应用程序访问文件或直接通过智能手机/平板电脑/计算机上的浏览器,是否有可能检测到? 我认为使用PHP的解决方案要好得多,因为Javascript可以关闭。 至少Google Analytics可以区分Safari和Safari(应用内)。 它应该适用于iOS和Android的每个版本。

谢谢你的帮助。


经过多次尝试,我终于find了适合我的解决方案!

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:应用程序中的软件包名称存储在PHPvariables$_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检查是否正在使用您的应用内网页视图:

 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,请参阅开发人员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。