Обнаружение браузера в приложении (WebView) с помощью PHP/Javascript
Я разработал приложение для iOS и Android, которое обращается к файлу HTML с моего веб-сервера с помощью браузера в приложении (Webview).
Я не хочу, чтобы пользователь мог получить доступ к этому файлу без использования приложения. Есть ли возможность обнаружить, если пользователь обращается к файлу с приложением или напрямую через браузер на этом смартфоне/планшете/компьютере? Я думаю, что решение с 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)';
}
Android:
Имя пакета из приложения хранится в переменной PHP $_SERVER['HTTP_X_REQUESTED_WITH']
.
// Android (in-app)
if($_SERVER['HTTP_X_REQUESTED_WITH'] == "com.company.app") {
echo 'Android (in-app)';
}
Как уже сказал Тим ван Эльсло, заголовки HTTP могут быть подделаны, и это не совсем безопасно.
Ответы
Ответ 1
Я не уверен в Android, но когда вы используете IOS SDK UIWebView
, он отправляет имя и версию вашего приложения как часть пользовательского агента (YourApp/1.0
).
Затем вы можете использовать PHP, чтобы проверить, используется ли ваш веб-просмотр в приложении или нет:
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;
Ответ 3
Для Android WebView обратитесь к ссылке с Chrome разработчика - https://developer.chrome.com/multidevice/user-agent#webview_user_agent
В строке пользовательского агента уже есть подсказки, такие как "Мобильный", "wv".
Вы можете использовать что-то вроде
if (strpos($_SERVER['HTTP_USER_AGENT'], 'Mobile') !== false)
или
if (strpos($_SERVER['HTTP_USER_AGENT'], 'wv') !== false)
чтобы определить, является ли пользователь Android WebView.