Я разработал приложение для 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 могут быть подделаны, и это не совсем безопасно.
Я не уверен в Android, но когда вы используете UIWebView
iOS SDK, он отправляет имя и версию вашего приложения как часть пользовательского агента ( 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;