Beaucoup d'encre a déjà été renversée sur les raisons pour lesquelles la fameuse chaîne useragent ne doit pas être utilisée pour l'analyse du navigateur, et donner un message à l'utilisateur qu'il doit mettre à niveau son navigateur ou le site ne fonctionnera pas. Les principaux arguments sont les suivants:
Bien. Maintenant, je suis dans une situation où je pourrais penser que l'utilisation de la chaîne useragent est plus légitime et j'aimerais avoir une entrée. Nous sommes une petite entreprise qui propose un produit logiciel. Ce produit nécessite une application Web pour effectuer certaines tâches. Nous ne prenons actuellement en charge que les versions récentes des principaux navigateurs. Cela signifie que IE9 ou opera ne sont pas entièrement pris en charge. Lorsqu'un utilisateur de notre produit se connecte sur notre application Web, il recevra un avertissement (pas une fenêtre pop-up, juste un message) indiquant son Le navigateur peut ne pas prendre en charge toutes les fonctionnalités. Les raisons pour lesquelles je pense que cet avertissement ne souffre pas des problèmes mentionnés ci-dessus et est en fait un avertissement "Nice to have" juste avant de vous connecter, sont:
Y a-t-il de graves défauts dans mon raisonnement? Ou peut-être d'autres raisons pour lesquelles l'utilisation de la chaîne useragent entraînera l'apparition ou non du message de manière inappropriée? Cela nuira-t-il à la crédibilité de notre produit s'il est jugé "non professionnel" ou "insultant" si nous refusons le navigateur de quelqu'un?
Si vous êtes dans une entreprise, vous contrôlez vos utilisateurs. Il existe différentes façons de les verrouiller sur le navigateur qu'ils sont autorisés à utiliser, que ce soit via une image, une stratégie de groupe, des paramètres de pare-feu, etc. Maintenant, par vous, je veux dire évidemment ceux de l'entreprise qui ont les autorisations pour le faire donc.
Cependant, si vous ne voulez pas parcourir tous ces cercles et que vous souhaitez détecter le navigateur sur lequel ils se trouvent et procéder en conséquence, la meilleure pratique consiste depuis longtemps à utiliser la détection des fonctionnalités , pas de reniflement d'agent utilisateur.
Ma ressource préférée est Modernizr par Paul Irish et son équipe.
Dans son article, Apprivoiser le Web sans loi avec détection de fonctionnalités, Jonathan Sampson déclare ce qui suit:
Renifler la chaîne de l'agent utilisateur d'un navigateur, c'est un peu comme jouer à la roulette russe. Bien sûr, vous avez peut-être évité la chambre chargée cette fois, mais si vous continuez à jouer, vous augmenterez inévitablement vos chances de faire une erreur plutôt méchante.
La chaîne navigator.userAgent n'est pas et n'a jamais été immuable. Ça change. Il est modifié. Au fur et à mesure que les navigateurs sont lancés, que de nouvelles versions sont distribuées, que les navigateurs sont installés sur différents systèmes d'exploitation, que les logiciels sont installés en parallèle au navigateur et que les modules complémentaires sont installés dans le navigateur, cette chaîne est modifiée. Donc ce que vous reniflez aujourd'hui n'est pas ce que vous reniflerez demain.
Jetez un coup d'œil à quelques exemples de Chrome , Firefox , Opera et Internet Explorer . En fin de compte, vous ne pouvez pas être sûr de ce que vous obtiendrez lorsque vous approcherez du buffet de chaînes d'agent utilisateur. Comme il est immédiatement clair, l'approche ci-dessus ne correspondrait même pas à la version 12 de Opera de manière cohérente avec ses variations.
Alors, je vous ai complètement convaincu que renifler est mauvais? Et l'avez-vous juré aussi longtemps que vous vivrez? Permettez-moi de vous donner quelque chose pour le remplacer; quelque chose de fiable qui ne vous laissera presque jamais tomber - la détection des fonctionnalités.
La détection des fonctionnalités consiste à tester le navigateur, directement lié à la fonctionnalité dont vous avez besoin, et à voir si elle réussit ou échoue. Par exemple, nous pouvons voir si le navigateur prend en charge le
<video>
tag en le questionnant pour savoir s'il place les bonnes propriétés sur une instance fraîchement créée de l'élément. Si le navigateur ne parvient pas à ajouter le.canPlayType
méthode à l'élément, nous pouvons supposer que le support n'est pas là, ou n'est pas suffisant pour être fiable.Cette approche ne nous oblige pas à faire d'hypothèses. Nous ne couplons pas des données mal récupérées avec des hypothèses naïves sur les navigateurs qui prennent en charge quelle fonctionnalité. Nous invitons plutôt le navigateur sur notre scène et nous lui demandons de faire des tours. S'il réussit, nous le récompensons. S'il échoue, nous l'abandonnons et adoptons une autre approche.
Vous pourriez à juste titre être flippé à propos de tous les tests que vous auriez à passer. Vous voudrez peut-être voir si localStorage est pris en charge, les dégradés, la vidéo, l'audio ou la géolocalisation. Qui sur Terre a le temps de passer tous ces tests? Sans parler d'apprendre les différentes technologies suffisamment pour le faire? C'est là que la communauté a sauvé la situation.
Modernizr est une bibliothèque open source remplie de tests de détection de fonctionnalités rédigés par des dizaines de développeurs talentueux, et tous regroupés dans une solution facile à utiliser que vous pouvez insérer dans n'importe quel nouveau projet. Vous créez votre téléchargement personnalisé de Modernizr, le déposez dans votre projet, puis offrez conditionnellement la meilleure expérience possible à tous les visiteurs.
Modernizr expose un objet Modernizr global avec diverses propriétés. Vous pouvez tester la prise en charge de certaines fonctionnalités simplement en appelant des propriétés sur l'objet Modernizr.
if ( Modernizr.video ) { // Browser supports the video element }
De plus, il peut éventuellement ajouter des classes à votre élément afin que votre CSS puisse également participer à l'action! Cela vous permet d'apporter des ajustements conditionnels à votre document en fonction de la prise en charge des fonctionnalités.
html.video { /* Woot! Video support. */ } html.no-video #custom-video-controls { /* Bummer. No video support. */ display: none; }
Vos raisons initiales pour ne pas faire confiance au useragent
trouvé dans l'objet navigator
sont correctes. Pour répondre à votre question, j'aimerais ajouter quelque chose aux n ° 1 et n ° 2. Les navigateurs modifient souvent la valeur de useragent
.
Dans mon navigateur actuel, le résultat de window.navigator.userAgent
est:
"Mozilla/5.0 (Windows NT 6.3; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/34.0.1847.116 Safari/537.36"
Alors, quel navigateur est-ce que j'utilise? Mozilla? Safari? Chrome? En ce moment, je lance Chrome v34. L'autre jour, je l'ai fait dans Chrome et Chrome n'apparaissait même pas dans le userAgent
chaîne. Je crois comprendre que les navigateurs modifient souvent cette valeur pour contourner les sites qui tentent de détecter le navigateur.
Donc, ma principale préoccupation serait la validité de l'analyse de la chaîne userAgent
. Mais WhichBrowser est souvent précis (je l'ai fait apparaître incorrectement auparavant, mais presque jamais).
En supposant que vous obtenez un résultat précis dans votre analyse, cela ne nuirait pas beaucoup à la réputation, voire pas du tout. Beaucoup dans le monde de l'entreprise ont l'habitude de voir des directives strictes concernant les logiciels ou les versions de logiciels qu'ils sont autorisés à utiliser. Il semble que vous n'aurez qu'à afficher un avertissement pour leur faire savoir que le produit n'est pas optimisé pour leur navigateur. Tant que ce n'est qu'un avertissement similaire à cela, ça devrait aller. Si vous leur interdisez explicitement d'y accéder via votre navigateur, cela entraînerait des problèmes.
Ci-dessus est un exemple de bonne et raisonnable UX sur la détection d'une version de navigateur qui peut rencontrer des problèmes.
Il décrit brièvement le comportement errant, évitant ainsi de nombreuses demandes d'aide. Il dit essentiellement: "si vous continuez, vous êtes seul."
J'ai continué BTW sans difficulté. Mais s'il y en avait eu, je n'aurais pas pris la peine de demander de l'aide. J'avais été prévenu.