web-dev-qa-db-fra.com

Détecter le navigateur intégré (WebView) avec PHP / Javascript

J'ai développé une application pour iOS et Android qui permet d'accéder à un fichier HTML à partir de mon serveur Web à l'aide du navigateur intégré (Webview).

Je ne veux pas qu'un utilisateur puisse accéder à ce fichier sans utiliser l'application. Est-il possible de détecter si l'utilisateur accède au fichier avec l'application ou directement via un navigateur sur ce smartphone/tablette/ordinateur? Je pense qu'une solution avec PHP est bien meilleure, car Javascript peut être désactivé. Google Analytics peut au moins différencier Safari de Safari (in-app). Cela devrait fonctionner avec toutes les versions d'iOS et Android.

Merci de votre aide.


Solution

Après plusieurs tentatives, j'ai finalement trouvé une solution efficace pour moi!

iOS: Vous pouvez détecter la différence entre Safari et le navigateur intégré à l'application à l'aide de l'agent d'utilisateur. Il existe probablement une solution plus intéressante, mais cela fonctionne.

// Safari (in-app)
if ((strpos($_SERVER['HTTP_USER_AGENT'], 'Mobile/') !== false) && (strpos($_SERVER['HTTP_USER_AGENT'], 'Safari/') == false) {
    echo 'Safari (in-app)';
}

Android: Le nom du package de l'application est stocké dans la variable PHP _ $_SERVER['HTTP_X_REQUESTED_WITH'].

// Android (in-app)
if($_SERVER['HTTP_X_REQUESTED_WITH'] == "com.company.app") {
    echo 'Android (in-app)';
}

Comme Tim van Elsloo l'a déjà noté, les en-têtes HTTP peuvent être falsifiés, ce qui n'est pas absolument sécurisé.

15
ohh2ahh

Je ne suis pas certain pour Android, mais lorsque vous utilisez la UIWebView du SDK iOS, celui-ci envoie le nom et la version de votre application dans le cadre de l'agent utilisateur (YourApp/1.0).

Vous pouvez ensuite utiliser PHP pour vérifier si votre vue Web intégrée à l'application est utilisée ou non:

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

Je pense que Android fait quelque chose de similaire aussi.

5
elslooo

Code de la solution:

$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;
4
Alex Baur

Pour Android WebView, consultez le lien fourni par Developer Chrome - https://developer.chrome.com/multidevice/user-agent#webview_user_agent

Il existe déjà des astuces disponibles dans la chaîne de l'agent utilisateur, telles que "Mobile", "wv".

Vous pouvez utiliser quelque chose comme

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

ou 

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

pour détecter si l'utilisateur est un WebView Android.

0
Mallikarjun M