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

2022-08-30 21:16:28

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

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

感谢您的帮助。


溶液

经过多次尝试,我终于为我找到了一个可行的解决方案!

苹果系统:您可以使用用户代理检测 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标头可以被伪造,这不是绝对安全的。


答案 1

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

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

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

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


答案 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;