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é.
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.
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;
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.