Détection automatique du navigateur mobile (via l'agent utilisateur?) [Fermé]

291

Comment puis-je détecter si un utilisateur consulte mon site Web à partir d'un navigateur Web mobile afin que je puisse ensuite détecter et afficher automatiquement la version appropriée de mon site Web?


la source
12
L'iPad compte-t-il? :)
Seva Alekseyev
33
Le commentaire de Seva soulève une bonne question. Que signifie vraiment "mobile" aujourd'hui? Se réfère-t-il à un "téléphone de fonction" qui a un navigateur mais pas beaucoup? Se réfère-t-il aux téléphones intelligents complets où la méthode de saisie et la résolution d'affichage sont des facteurs limitants? Qu'en est-il des tablettes à la fois faciles à interagir et dotées d'écrans haute résolution? Qu'en est-il des appareils comme les centres multimédias - ils ne quittent jamais le salon, mais ils ont des limites similaires. Un ami au travail m'a envoyé ça. Je l'ai trouvé très perspicace. slideshare.net/bryanrieger/rethinking-the-mobile-web-by-yiibu
spaaarky21
1
@Ricki mais sur l'ipad, vous ne pouvez toujours pas, par exemple, afficher du contenu flash ou utiliser un éditeur de texte riche basé sur javascript comme tinymce.
TJ Ellis
1
ipad ne peut pas voir le flash, mais c'est un sujet différent, comme détecter si le navigateur prend en charge le flash.
Shaun
2
Juste un article du futur, mais toute personne intéressée à proposer une version mobile de son site peut être intéressée par certains articles sur le "responsive design".
Vael Victus

Réponses:

91

Oui, la lecture de l'en-tête User-Agent fera l'affaire.

Il y a des listes sur il des agents utilisateurs mobiles connus de sorte que vous n'avez pas besoin de repartir à zéro. Ce que j'ai fait lorsque je devais le faire, c'est de créer une base de données d'agents utilisateurs connus et de stocker les inconnues lors de leur détection pour révision, puis de déterminer manuellement ce qu'elles sont. Cette dernière chose pourrait être exagérée dans certains cas.

Si vous voulez le faire au niveau Apache, vous pouvez créer un script qui génère périodiquement un ensemble de règles de réécriture vérifiant l'agent utilisateur (ou juste une fois et oubliez les nouveaux agents utilisateurs, ou une fois par mois, selon votre cas), comme

RewriteEngine On

RewriteCond %{HTTP_USER_AGENT} (OneMobileUserAgent|AnotherMobileUserAgent|...)
RewriteRule (.*) mobile/$1

qui déplacerait, par exemple, les demandes vers http: //domain/index.html vers http: //domain/mobile/index.html

Si vous n'aimez pas l'approche consistant à faire recréer périodiquement un fichier htaccess par un script, vous pouvez écrire un module qui vérifie l'agent utilisateur (je n'en ai pas trouvé un déjà fait, mais j'ai trouvé cet exemple particulièrement approprié ) et obtenir les agents utilisateurs de certains sites pour les mettre à jour. Ensuite, vous pouvez compliquer l'approche autant que vous le souhaitez, mais je pense que dans votre cas, l'approche précédente conviendrait.

Vinko Vrsalovic
la source
3
Cela peut-il être accompli au niveau de la couche serveur Web (Apache) via un certain type de commande .htaccess - au lieu d'utiliser un langage de script comme PHP?
toute idée de définir la racine du document par user-agent
Carson
126

Il existe des scripts open source sur Detect Mobile Browser qui le font dans Apache, ASP, ColdFusion, JavaScript et PHP.

Chad Smith
la source
5
@guitar Si tel est le cas, vous devez envoyer votre UA.
Adam Tuttle
9
Bleh ... Je n'aime vraiment pas "l'odeur de code" de ces solutions. Correspondance d'expression régulière à l'aide d'un tas de préfixes à 4 caractères sans aucune indication quant à leur origine ... non merci.
Nous sommes tous Monica
2
Il s'agit là d'une déclaration d'expression rationnelle grossière. Je suis d'accord, l'odeur du code n'est pas bonne sur celui-ci.
Jack Cox
5
Je n'aime pas non plus les solutions "Open Source" sans licence et sans indication de mises à jour.
Eduardo
12
Il n'y a aucun moyen de contourner cela cependant. À un certain niveau, tout type de solution va effectuer une vérification d'expression rationnelle sur l'agent utilisateur.
Kyle
33

Juste une pensée mais que se passe-t-il si vous travaillez ce problème dans la direction opposée? Plutôt que de déterminer quels navigateurs sont mobiles, pourquoi ne pas déterminer quels navigateurs ne le sont pas? Ensuite, codez votre site par défaut sur la version mobile et redirigez-le vers la version standard. Il existe deux possibilités de base lorsque vous regardez un navigateur mobile. Soit il prend en charge javascript, soit il ne l'est pas. Donc, si le navigateur n'a pas de support javascript, il sera par défaut à la version mobile. S'il prend en charge JavaScript, vérifiez la taille de l'écran. Tout ce qui est inférieur à une certaine taille sera probablement également un navigateur mobile. Tout ce qui est plus grand sera redirigé vers votre mise en page standard. Ensuite, tout ce que vous devez faire est de déterminer si l'utilisateur avec JavaScript désactivé est mobile ou non.
Selon le W3C, le nombre d'utilisateurs avec JavaScript désactivé était d'environ 5% et la plupart des utilisateurs l'ont désactivé, ce qui implique qu'ils savent réellement ce qu'ils font avec un navigateur. Sont-ils une grande partie de votre public? Sinon, ne vous en faites pas. Si oui, quel est le pire des cas? Vous avez ces utilisateurs qui parcourent la version mobile de votre site, et c'est une bonne chose.

midsever
la source
3
C'est une très bonne idée, je pense que c'est une solution élégante.
Maxim Veksler
3
+1, cela semble une idée plutôt sympa, mais cela affecterait-il les robots des moteurs de recherche?
Mikey G
C'est une idée erronée. Les extensions de navigateur qui désactivent le javascript sont très populaires sur les navigateurs de bureau, donc supposer qu'aucun javascript ne signifie que le mobile est tout simplement faux. La résolution de la fenêtre / fenêtre / écran n'a rien à voir avec la taille d'un navigateur, et en supposant qu'une faible résolution indique la taille de l'ordinateur de poche rendra votre application Web laide et frustrante pour de nombreux utilisateurs. (Par exemple: navigateurs de bureau dans des fenêtres non plein écran, grandes tablettes.)
ʇsәɹoɈ
31

Voici comment je le fais en JavaScript:

function isMobile() {
  var index = navigator.appVersion.indexOf("Mobile");
  return (index > -1);
}

Voir un exemple sur www.tablemaker.net/test/mobile.html où il triple la taille de police sur les téléphones mobiles.

Ed Poor
la source
si vous souhaitez fusionner vos comptes, voyez ici: meta.stackexchange.com/questions/18232/…
Brandon
Cela ne fonctionnera pas en ce qui concerne la tablette (par exemple iPad)
Si8
Utilisez "mobi" à cause d'Opera Mobile.
mgutt
1
Et vous avez besoin de "Opera Mini" car c'est l'un des rares navigateurs n'utilisant pas "mobi" dans l'agent utilisateur.
mgutt
17

Mon mécanisme de détection de navigateur mobile préféré est WURFL . Il est mis à jour fréquemment et fonctionne avec toutes les principales plateformes de programmation / langage.

Pablo Santa Cruz
la source
C'est bien, mais la déclaration "fonctionne avec toutes les principales plates-formes de programmation / langage" est un peu audacieuse.
Kyle
8
Ce n'est également plus gratuit .
MarkJ
Il n'est désormais disponible que sous la licence embêtante AGPL, sauf si vous l'achetez. en.wikipedia.org/wiki/WURFL#License_update
MarkJ
17

Avez-vous envisagé d'utiliser des requêtes multimédias CSS3? Dans la plupart des cas, vous pouvez appliquer certains styles CSS spécifiquement pour l'appareil ciblé sans avoir à créer une version mobile distincte du site.

@media screen and (max-width:1025px) {
   #content {
     width: 100%;
   }
}

Vous pouvez définir la largeur comme vous le souhaitez, mais le 1025 capturera la vue paysage de l'iPad.

Vous voudrez également ajouter la balise META suivante à votre tête:

<meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1">

Consultez cet article sur HTML5 Rocks pour de bons exemples

Cory
la source
1
Je pense que c'est en fait la meilleure façon de procéder. Les scripts qui regardent les chaînes de l'agent utilisateur sont destinés à être obsolètes. L'examen de l'espace disponible sur l'écran permet une conception réactive sans se soucier de la non détection de nouveaux appareils.
Adam Tuttle
1
Cela ne fonctionne que pour la détection côté client. Mais si vous souhaitez que votre côté serveur se comporte différemment pour les clients mobiles, vous devrez utiliser une autre technique.
Igor Brejc
Cela échoue lamentablement pour les navigateurs de bureau qui ne fonctionnent pas en plein écran. Si vous choisissez de le faire de toute façon, veuillez ne pas gaspiller d'espace à l'écran avec des polices et des marges énormes, ou masquer des fonctionnalités / informations importantes derrière les menus déroulants. Cela rendra votre site / application laid et frustrant pour certains de vos utilisateurs.
ʇsәɹoɈ
13

pour ANDROID, IPHONE, IPAD, BLACKBERRY, PALM, WINDOWS CE, PALM

 <script language="javascript"> <!--
     var mobile = (/iphone|ipad|ipod|android|blackberry|mini|windows\sce|palm/i.test(navigator.userAgent.toLowerCase()));
              if (mobile) {
                  alert("MOBILE DEVICE DETECTED");
                  document.write("<b>------------------------------------------<br>")
                  document.write("<b>" + navigator.userAgent + "<br>")
                  document.write("<b>------------------------------------------<br>")
                  var userAgent = navigator.userAgent.toLowerCase();
                  if ((userAgent.search("android") > -1) && (userAgent.search("mobile") > -1))
                         document.write("<b> ANDROID MOBILE <br>")
                   else if ((userAgent.search("android") > -1) && !(userAgent.search("mobile") > -1))
                       document.write("<b> ANDROID TABLET <br>")
                   else if ((userAgent.search("blackberry") > -1))
                       document.write("<b> BLACKBERRY DEVICE <br>")
                   else if ((userAgent.search("iphone") > -1))
                       document.write("<b> IPHONE DEVICE <br>")              
                   else if ((userAgent.search("ipod") > -1))
                       document.write("<b> IPOD DEVICE <br>")
               else if ((userAgent.search("ipad") > -1))
                       document.write("<b> IPAD DEVICE <br>")
                       else
                   document.write("<b> UNKNOWN DEVICE <br>")
              }
              else
                  alert("NO MOBILE DEVICE DETECTED"); //--> </script>
Jorgesys
la source
J'ai trouvé cela très utile.
bozdoz
Vous devriez certainement vérifier Conditionizr qui s'occupera de tout cela pour vous! Vous pouvez ajouter des tests personnalisés, les récupérer via des tests d'objet et avoir des rappels. Ils ont également une gamme de tests prédéfinis disponibles: conditionizr.com/detects
Halcyon991
Elenasys, merci pour la réponse utile. Cependant, je ne trouve aucun UA correspondant "windows \ sce" dans ma base de données.
nefski
1
Cela ne fonctionne pas pour les téléphones Windows.
jwerre
merci mais Windows phone n'a pas été précisé ...
Jorgesys
6

Le fichier de navigateur de périphérique mobile est un excellent moyen de détecter les navigateurs mobiles (et autres) pour les projets ASP.NET: http://mdbf.codeplex.com/

mjf
la source
Le navigateur d'appareil mobile fonctionne-t-il toujours? Je remarque qu'il y a une notation indiquant qu'il est hors ligne? ...
creativeedg10
5

Vous pouvez détecter les clients mobiles simplement via navigator.userAgent, et charger des scripts alternatifs basés sur le type de client détecté comme:

 $(document).ready(function(e) {

        if(navigator.userAgent.match(/Android/i)
          || navigator.userAgent.match(/webOS/i)
          || navigator.userAgent.match(/iPhone/i)
          || navigator.userAgent.match(/iPad/i)
          || navigator.userAgent.match(/iPod/i)
          || navigator.userAgent.match(/BlackBerry/i)
          || navigator.userAgent.match(/Windows Phone/i)) {

         //write code for your mobile clients here.

          var jsScript = document.createElement("script");
          jsScript.setAttribute("type", "text/javascript");
          jsScript.setAttribute("src", "js/alternate_js_file.js");
          document.getElementsByTagName("head")[0].appendChild(jsScript );

          var cssScript = document.createElement("link");
          cssScript.setAttribute("rel", "stylesheet");
          cssScript.setAttribute("type", "text/css");
          cssScript.setAttribute("href", "css/alternate_css_file.css");
          document.getElementsByTagName("head")[0].appendChild(cssScript); 

    }
    else{
         // write code for your desktop clients here
    }

    });
sohel khalifa
la source
Pour une solution plus gérable, vous pouvez utiliser Conditionizr qui gérera tout cela pour vous! Vous pouvez ajouter des tests personnalisés, les récupérer via des tests d'objet et avoir des rappels. Ils ont également une gamme de tests prédéfinis disponibles: conditionizr.com/detects
Halcyon991
4

Vous pouvez vérifier la chaîne User-Agent. En JavaScript, c'est vraiment facile, c'est juste une propriété de l'objet navigateur.

var useragent = navigator.userAgent;

Vous pouvez vérifier si l'appareil iPhone ou Blackberry dans JS avec quelque chose comme

var isIphone = !!agent.match(/iPhone/i),
    isBlackberry = !!agent.match(/blackberry/i);

si isIphone est vrai, vous accédez au site à partir d'un Iphone, si isBlackBerry vous accédez au site à partir d'un Blackberry.

Vous pouvez utiliser le plugin "UserAgent Switcher" pour Firefox pour tester cela.

Si vous êtes également intéressé, cela peut valoir la peine de consulter mon script "redirection_mobile.js" hébergé sur github ici https://github.com/sebarmeli/JS-Redirection-Mobile-Site et vous pouvez lire plus de détails dans l'un des mon article ici:

http://blog.sebarmeli.com/2010/11/02/how-to-redirect-your-site-to-a-mobile-version-through-javascript/

sebarmeli
la source
1
L'utilisation de .match est incorrecte ici, vous voulez utiliser .test () qui évalue à une valeur booléenne, c'est aussi beaucoup plus rapide que .match () et ne retourne pas de tableau. Pour une solution plus gérable à vos tests userAgent, vous pouvez utiliser Conditionizr qui gérera tout cela pour vous! Vous pouvez ajouter des tests personnalisés, les récupérer via des tests d'objet et avoir des rappels. Ils ont également une gamme de tests prédéfinis disponibles: conditionizr.com/detects
Halcyon991
4
protected void Page_Load(object sender, EventArgs e)
{
    if (Request.Browser.IsMobileDevice == true)
    {
        Response.Redirect("Mobile//home.aspx");
    }
}

Cet exemple fonctionne dans asp.net

shiv
la source
3

Vous n'avez pas dit quelle langue vous utilisez. Si c'est Perl alors c'est trivial:

use CGI::Info;

my $info = CGI::Info->new();

if($info->is_mobile()) {
   # Add mobile stuff
}

unless($info->is_mobile()) {
   # Don't do some things on a mobile
}
Nigel Horne
la source
Quel module utiliser: neilb.org/reviews/user-agent.html
Jonas G. Drange
0

Oui, l'agent utilisateur est utilisé pour détecter les navigateurs mobiles. Il existe de nombreux scripts gratuits disponibles pour vérifier cela. Voici un tel code php qui vous aidera à rediriger les utilisateurs mobiles vers différents sites Web.

Shoban
la source
1
Cela peut-il être accompli au niveau de la couche serveur Web (Apache) via un certain type de commande .htaccess - au lieu d'utiliser PHP?
0

J'ai mis cette démo avec des scripts et des exemples inclus:

http://www.mlynn.org/2010/06/mobile-device-detection-and-redirection-with-php/

Cet exemple utilise des fonctions php pour la détection d'agent utilisateur et offre l'avantage supplémentaire de permettre aux utilisateurs d'indiquer une préférence pour une version du site qui ne serait généralement pas la valeur par défaut en fonction de leur navigateur ou type d'appareil. Cela se fait avec des cookies (maintenus en utilisant php côté serveur par opposition à javascript.)

Assurez-vous de consulter le lien de téléchargement dans l'article pour les exemples.

Espérons que vous apprécierez!

Michael Lynn
la source
0

MobileESP dispose de crochets PHP, Java, APS.NET (C #), Ruby et JavaScript. il possède également la licence Apache 2, donc gratuite pour une utilisation commerciale. L'essentiel pour moi est qu'il n'identifie que les navigateurs et les plates-formes, pas les tailles d'écran et autres mesures, ce qui le maintient bien petit.

Rob
la source