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

使用PHP/Javascript检测应用程序内浏览器(WebView),php,javascript,android,ios,xcode,Php,Javascript,Android,Ios,Xcode,我为iOS和Android开发了一个应用程序,它使用应用程序内浏览器(Webview)从我的Web服务器访问HTML文件 我不希望用户不使用应用程序就可以访问此文件。是否有可能检测到用户是否使用应用程序或直接通过此智能手机/平板电脑/计算机上的浏览器访问文件?我认为使用PHP的解决方案更好,因为Javascript可以关闭。至少谷歌分析可以区分Safari和Safari(应用程序内)。它应该适用于iOS和Android的每个版本 谢谢你的帮助 解决方案 经过多次尝试,我终于找到了一个可行的解决

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

我不希望用户不使用应用程序就可以访问此文件。是否有可能检测到用户是否使用应用程序或直接通过此智能手机/平板电脑/计算机上的浏览器访问文件?我认为使用PHP的解决方案更好,因为Javascript可以关闭。至少谷歌分析可以区分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变量
$\u SERVER['HTTP\u X\u REQUESTED\u 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,请参阅开发者Chrome-

用户代理字符串中已经有可用的提示,如“Mobile”、“wv”

您可以使用类似于

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


检测用户是否为Android WebView。

请注意,桌面浏览器也可能伪造此信息(通过设置“伪造”HTTP头),因此从安全角度来看,您不应该依赖此信息。感谢您的快速帮助。不幸的是,用户代理不包括应用程序名称。至少在我的尝试中没有。您使用的是
UIWebView
?它应该是这样的:
或者。是的,我正在使用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变量
$\u服务器['HTTP\u USER\u AGENT']
不正确?如果从其他浏览器打开页面,iOs解决方案将失败。经过一些测试,我对它进行了一些改进。检查这里:这个方法对IOS11仍然有效吗,因为在IOS11中,甚至对于应用内浏览器,我们都会返回包含单词Safari的HTTP\u USER\u代理值。我们得到的是: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?
if (strpos($_SERVER['HTTP_USER_AGENT'], 'wv') !== false)