Обнаружение браузера в приложении (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.