web-dev-qa-db-fra.com

Comment détecter le stock Android navigateur

Naviguer vers http://whatsmyuseragent.com/ me montre mon navigateur Android d'origine sur mon Galaxy Nexus sous 4.2.1 doté de l'agent utilisateur.

Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/534.24 (KHTML, like Gecko) Chrome/11.0.696.34 Safari/534.24

Rien dans cet agent d'utilisateur ne me permet de détecter de manière unique qu'il s'agit d'un navigateur d'origine Android. L'application Chrome pour Android a au moins Android dans l'agent d'utilisateur. Est-il possible pour moi de détecter l'application stock Android?

46
gsingh2011
var navU = navigator.userAgent;

// Android Mobile
var isAndroidMobile = navU.indexOf('Android') > -1 && navU.indexOf('Mozilla/5.0') > -1 && navU.indexOf('AppleWebKit') > -1;

// Apple webkit
var regExAppleWebKit = new RegExp(/AppleWebKit\/([\d.]+)/);
var resultAppleWebKitRegEx = regExAppleWebKit.exec(navU);
var appleWebKitVersion = (resultAppleWebKitRegEx === null ? null : parseFloat(regExAppleWebKit.exec(navU)[1]));

// Chrome
var regExChrome = new RegExp(/Chrome\/([\d.]+)/);
var resultChromeRegEx = regExChrome.exec(navU);
var chromeVersion = (resultChromeRegEx === null ? null : parseFloat(regExChrome.exec(navU)[1]));

// Native Android Browser
var isAndroidBrowser = isAndroidMobile && (appleWebKitVersion !== null && appleWebKitVersion < 537) || (chromeVersion !== null && chromeVersion < 37);
28
efusien

"Navigateur Android" est le nom d'un navigateur. Déroutant peut-être, mais avec une question comme celle-ci, ça ne devrait pas l'être. C'est le navigateur fourni avec la grande majorité des appareils Android), et il ne parle évidemment pas de Chrome.

Selon http://www.useragentstring.com/ , voici la liste complète des chaînes Android Stock Browser. Je ne sais pas s'il existe un meilleur moyen de sélectionnez-les tous en même temps, car certains continueront à être ajoutés, et qui ne cibleraient pas accidentellement Chrome sur Android. Espérons que quelqu'un vous donne une meilleure réponse car je suis moi-même curieux des meilleurs chemin à faire à ce sujet.

Mozilla/5.0 (Linux; U; Android 4.0.3; ko-kr; LG-L160L Build/IML74K) AppleWebkit/534.30 (KHTML, like Gecko) Version/4.0 Mobile Safari/534.30

Mozilla/5.0 (Linux; U; Android 4.0.3; de-ch; HTC Sensation Build/IML74K) AppleWebKit/534.30 (KHTML, like Gecko) Version/4.0 Mobile Safari/534.30

Mozilla/5.0 (Linux; U; Android 2.3; en-us) AppleWebKit/999+ (KHTML, like Gecko) Safari/999.9

Mozilla/5.0 (Linux; U; Android 2.3.5; zh-cn; HTC_IncredibleS_S710e Build/GRJ90) AppleWebKit/533.1 (KHTML, like Gecko) Version/4.0 Mobile Safari/533.1

Mozilla/5.0 (Linux; U; Android 2.3.5; en-us; HTC Vision Build/GRI40) AppleWebKit/533.1 (KHTML, like Gecko) Version/4.0 Mobile Safari/533.1

Mozilla/5.0 (Linux; U; Android 2.3.4; fr-fr; HTC Desire Build/GRJ22) AppleWebKit/533.1 (KHTML, like Gecko) Version/4.0 Mobile Safari/533.1

Mozilla/5.0 (Linux; U; Android 2.3.4; en-us; T-Mobile myTouch 3G Slide Build/GRI40) AppleWebKit/533.1 (KHTML, like Gecko) Version/4.0 Mobile Safari/533.1

Mozilla/5.0 (Linux; U; Android 2.3.3; zh-tw; HTC_Pyramid Build/GRI40) AppleWebKit/533.1 (KHTML, like Gecko) Version/4.0 Mobile Safari/533.1

Mozilla/5.0 (Linux; U; Android 2.3.3; zh-tw; HTC_Pyramid Build/GRI40) AppleWebKit/533.1 (KHTML, like Gecko) Version/4.0 Mobile Safari

Mozilla/5.0 (Linux; U; Android 2.3.3; zh-tw; HTC Pyramid Build/GRI40) AppleWebKit/533.1 (KHTML, like Gecko) Version/4.0 Mobile Safari/533.1

Mozilla/5.0 (Linux; U; Android 2.3.3; ko-kr; LG-LU3000 Build/GRI40) AppleWebKit/533.1 (KHTML, like Gecko) Version/4.0 Mobile Safari/533.1

Mozilla/5.0 (Linux; U; Android 2.3.3; en-us; HTC_DesireS_S510e Build/GRI40) AppleWebKit/533.1 (KHTML, like Gecko) Version/4.0 Mobile Safari/533.1

Mozilla/5.0 (Linux; U; Android 2.3.3; en-us; HTC_DesireS_S510e Build/GRI40) AppleWebKit/533.1 (KHTML, like Gecko) Version/4.0 Mobile

Mozilla/5.0 (Linux; U; Android 2.3.3; de-de; HTC Desire Build/GRI40) AppleWebKit/533.1 (KHTML, like Gecko) Version/4.0 Mobile Safari/533.1

Mozilla/5.0 (Linux; U; Android 2.3.3; de-ch; HTC Desire Build/FRF91) AppleWebKit/533.1 (KHTML, like Gecko) Version/4.0 Mobile Safari/533.1

Mozilla/5.0 (Linux; U; Android 2.2; fr-lu; HTC Legend Build/FRF91) AppleWebKit/533.1 (KHTML, like Gecko) Version/4.0 Mobile Safari/533.1

Mozilla/5.0 (Linux; U; Android 2.2; en-sa; HTC_DesireHD_A9191 Build/FRF91) AppleWebKit/533.1 (KHTML, like Gecko) Version/4.0 Mobile Safari/533.1

Mozilla/5.0 (Linux; U; Android 2.2.1; fr-fr; HTC_DesireZ_A7272 Build/FRG83D) AppleWebKit/533.1 (KHTML, like Gecko) Version/4.0 Mobile Safari/533.1

Mozilla/5.0 (Linux; U; Android 2.2.1; en-gb; HTC_DesireZ_A7272 Build/FRG83D) AppleWebKit/533.1 (KHTML, like Gecko) Version/4.0 Mobile Safari/533.1

Mozilla/5.0 (Linux; U; Android 2.2.1; en-ca; LG-P505R Build/FRG83) AppleWebKit/533.1 (KHTML, like Gecko) Version/4.0 Mobile Safari/533.1

Mozilla/5.0 (Linux; U; Android 2.2.1; de-de; HTC_Wildfire_A3333 Build/FRG83D) AppleWebKit/533.1 (KHTML, like Gecko) Version/4.0 Mobile Safari/533.1

Mozilla/5.0 (Linux; U; Android 2.1-update1; es-mx; SonyEricssonE10a Build/2.0.A.0.504) AppleWebKit/530.17 (KHTML, like Gecko) Version/4.0 Mobile Safari/530.17

Mozilla/5.0 (Linux; U; Android 1.6; ar-us; SonyEricssonX10i Build/R2BA026) AppleWebKit/528.5+ (KHTML, like Gecko) Version/3.1.2 Mobile Safari/525.20.1
16
TelFiRE

Vous pouvez faire la différence entre le navigateur stock et le navigateur Chrome en recherchant "Android" dans l'agent d'utilisateur et en vérifiant le numéro de version AppleWebKit/###.

Le navigateur Android d'origine n'est jamais passé au-dessus de 534 et Chrome est égal à 537 ou plus.

var maybeAndroid = navigator.userAgent.indexOf('Android') >= 0;
var webkitVer = parseInt(/WebKit\/([0-9]+)|$/.exec(navigator.appVersion)[1], 10); // also matches AppleWebKit
var isAOSP = maybeAndroid && webkitVer <= 534 && navigator.vendor.indexOf('Google') == 0;

Ceci est fiable à 99% et très utile pour une application sur Android 4.x à l'aide d'une vue Web.

== détails (si vous voulez aller en profondeur!) ==

Edit 7: 'AudioNode' in window Est probablement un reniflement sûr pour les versions AOSP (ou ancienne version de Chrome) par rapport aux versions modernes Chrome. Essayez-le ici . window.AudioNode a été introduit dans le cadre de la prise en charge de WebAudio dans Chrome 29 (et ne devrait pas être porté en arrière par les fabricants). Notre téléphone 4.0.3 a Chrome 41, et 'AudioNode' in window Renvoie true pour Chrome et false pour AOSP. Vous pouvez également rechercher d'autres fonctionnalités introduites après le développement de l'AOSP - voir ce lien pour connaître les autres fonctionnalités potentielles à détecter. Choisissez une fonctionnalité introduite avant Chrome 42 car Android 4.0 ne peut pas effectuer de mise à niveau au-delà de cette version. Comme d'habitude avec Android, il y aura sûrement des cas Edge étranges, mais ce sniff est probablement aussi bon que possible (en particulier s'il est associé à la vérification de la version de WebKit <537).

Edit 8:

== WebView sur Android ==

La vérification de <= 534 est un test parfait lors de l'utilisation d'une WebView dans une application. La définition de compatibilité pour Android 4.3 (la dernière version de Androidà utiliser AOSP pour WebView), indique le L'agent utilisateur WebView DOIT être: "Mozilla/5.0 (Linux; U; Android $(VERSION); $(LOCALE); $(MODEL) Build/$(BUILD)) AppleWebKit/534.30 (KHTML, like Gecko) Version/4.0 Mobile Safari/534.30".

La définition de compatibilité pour Android 4.4 (la première version Android à utiliser Chromium pour WebView), indique le L'agent utilisateur WebView DOIT être: "Mozilla/5.0 (Linux; Android $(VERSION); $(MODEL) Build/$(BUILD); wv) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 $(CHROMIUM_VER) Mobile Safari/537.36".

Moins de Android 4.3 est très similaire à la définition 4.3 (toujours AOSP). Supérieur à 4.4 est très similaire à la définition de 4.4 (toujours Chrome).

== AOSP sur Android ==

Pour le navigateur du périphérique (pas WebView), l'agent utilisateur n'est pas interdit par la définition de compatibilité. La version actuelle du navigateur utilisée varie beaucoup selon que est documenté sur quirksmode et que documenté pour la version du navigateur Samsung .

Edit 4: La solution recommandée consiste à rechercher Android sans Chrome dans l'agent d'utilisateur, comme indiqué dans: https://developer.chrome.com./multidevice/user-agent # webview_user_agent mais il peut également être nécessaire de s’assurer de l’absence de/Windows Phone/car Mobile-IE11-8.1-Update a également Android in l'UA "Mozilla/5.0 (Mobile; Windows Phone 8.1; Android 4.0; ARM; Trident/7.0; Touch; rv:11.0; IEMobile/11.0; NOKIA; Lumia 520) like iPhone OS 7_0_3 Mac OS X AppleWebKit/537 (KHTML, like Gecko) Mobile Safari/537". Édition 5: https://msdn.Microsoft.com/en-us/library/hh869301 (v = vs.85) .aspx indique que IE12 _ sur Windows Phone aura toujours Android dans l'agent d'utilisateur.

Edit 3: Comme l’ont dit les commentateurs, il existe des appareils avec AOSP et> = 535, mais c’est le test le plus fiable que j’ai trouvé (j’aimerais voir quelque chose de mieux). Vous pouvez simplement essayer de vous assurer que votre code est toujours fonctionnel si le sniff échoue et accepter le fait que Android fragmentation signifie qu'il y aura des périphériques impairs qui échoueront. Caveat Emptor. Éditer 6: En regardant quelques données pour un site spécifique, environ 1% de ce qui semble être des logins AOSP ont WebKit 537, donc bien que cela semble assez fiable, ce n’est certainement pas fiable à 100%.

Édition 2: Si vous utilisez WebView dans une application, cette détection est utile pour Android> = 4.0 && Android <4.4.4, car le composant WebView utilise AOSP même si Chrome est installé sur l'appareil.

Éditer 1: Puisque Android est devenu "obsolète", il est raisonnable de le tester (et d'utiliser l'indicateur pour contourner les différences qui ne peuvent pas être détectées à l'aide de la détection de fonctionnalités).

13
robocat

À l'heure actuelle, il n'y a pas de véritable méthode pour détecter cela. Je suis actuellement sur Android 4.2.2 stock. Galaxy S4 AT & T et le navigateur par défaut a maintenant Chrome dans l’utilisateur-agent (mais a toujours les numéros TouchWiz de position fixe)

Jusqu'à ce que Samsung puisse a) réparer le touchwiz ou b) supprimer chrome de la chaîne ua), nous n'avons pas de méthode réelle pour détecter le Android par défaut. Je ne peux pas Si c'est le cas pour tous les téléphones 4.2x +, il s'agit d'un problème majeur pour les équipes de développement qui ont besoin de requêtes spécifiques à un fabricant ou à un navigateur.

Je fais partie d'une équipe de développement active d'applications web pour terminaux mobiles et il semble que TouchWiz pose de nombreux problèmes pour différents aspects en cours de développement.

Un autre problème est qu'il existe des sociétés comme Dolphin (excellent navigateur, terrible UA) qui, dans tous ces cas, réapparaîtraient comme navigateur par défaut car il ne fournit pas de chaîne "dolphin" et utilise AppleWebKit534x.


Également en ce qui concerne le U dans la chaîne user-agent, cela n’a rien à voir avec quel navigateur. En effet, cela a à voir avec la méthode de cryptage utilisée pour chaque navigateur (généralement standard en fonction de l'emplacement)

"Les navigateurs Web créés aux États-Unis, tels que Netscape Navigator et Internet Explorer, utilisent les lettres U, I et N pour spécifier le niveau de cryptage dans la chaîne de l'agent utilisateur. Jusqu'en 1996, lorsque le gouvernement des États-Unis refusait le cryptage avec des clés plus longues plus de 40 bits à exporter, les fournisseurs ont fourni différentes versions de navigateur avec différents niveaux de cryptage. "U" signifie "USA" (pour la version avec cryptage 128 bits), "I" signifie "International" - le navigateur dispose de 40- peut être utilisé n'importe où dans le monde - et "N" signifie (de facto) "aucun" (pas de cryptage). [10] Suite à la levée des restrictions à l'exportation, la plupart des fournisseurs ont pris en charge le cryptage à 256 bits. "

Source: http://en.wikipedia.org/wiki/User_agent#Encryption_strength_notations

4
Cory

La réponse de efusien (11 novembre 13 à 20:18) fonctionne pour moi , bien qu'une variable n'ait pas été déclarée et qu'une virgule ait été utilisée dans un place au lieu d'un point-virgule, , ce qui entraîne un gros échec pour ceux qui recherchent une réponse copier/coller .

Voici ce qui a fonctionné pour moi, y compris un exemple pratique utilisant la condition "si c'est le navigateur natif":

var navU = navigator.userAgent;
// Android Mobile
var isAndroidMobile = navU.indexOf('Android') > -1 && navU.indexOf('Mozilla/5.0') > -1 && navU.indexOf('AppleWebKit') > -1;
// Android Browser (not Chrome)
var regExAppleWebKit = new RegExp(/AppleWebKit\/([\d.]+)/);
var resultAppleWebKitRegEx = regExAppleWebKit.exec(navU);
var appleWebKitVersion = (resultAppleWebKitRegEx === null ? null : parseFloat(regExAppleWebKit.exec(navU)[1]));
var isAndroidBrowser = isAndroidMobile && appleWebKitVersion !== null && appleWebKitVersion < 537;

$(window).load(function() {
    if (isAndroidBrowser) {
        // It's Android's native browser (and not Chrome), so do something
    }
});
3
Nick

Il semble que la présence de "Linux; U; Android" soit un facteur de différenciation cohérent pour le navigateur stock. Qui sait ce que le "U" signifie, mais je suppose que ce ne sera pas fiable dans le futur. Espérons que le navigateur va disparaître ou commencer à jouer comme Chrome lorsque les chaînes changent. Certaines autres chaînes sont ci-dessous pour la comparaison

Android Chrome: "Mozilla/5.0 (Linux; Android 4.1.2; SAMSUNG-SGH-I727 Build/JZO54K)] AppleWebKit/537.36 (KHTML, comme Gecko) Chrome/28.0.1500.94 Mobile Safari/537.36 "

Android Firefox: "Mozilla/5.0 (Android; Mobile; rv: 23.0) Gecko/23.0 Firefox/23.0"

Android Opera: "Mozilla/5.0 (Linux; Android 4.1.2; SAMSUNG-SGH-I727 Build/JZO54K)] AppleWebKit/537.36 (KHTML, comme Gecko) Chrome/28.0.1500.63 Mobile Safari/537.36 OPR/15.0.1162.61541 "

2
Paul Fox

Si JavaScript est une option pour vous au lieu du service d’aiguillage côté serveur, essayez (!!window.chrome) && (!window.chrome.app). Je ne peux cependant pas garantir que celui-ci est "sûr", fonctionnera "pour toujours", ou quelque chose du genre. Considérez cela comme un piratage diabolique à utiliser uniquement à des fins de test.

Explication: Chrome (ou Chrome?)) Navigateurs (ainsi, ceux que j'ai testés ici, qui étaient Chrome et = Android Actions sur CyanogenMod 10) possède un objet nommé window.chrome, mais sur le Android, celui que j’ai testé au moins, cet objet ne possède pas la propriété app.

Edit: On dirait que les versions plus anciennes Chrome donneront des faux positifs avec cette solution. À leur tour, les versions plus récentes du navigateur de stock donneront très probablement des "faux négatifs".

1
depoulo

Je pense que vous recherchez ceci:

Navigateur natif Android non mis à jour au-dessus de la version 534.30 afin que vous puissiez filtrer la version et Android Combinaison de chaînes UA (ci-dessus, nous pouvons présumer que c'est un navigateur = Chrome))

Voici mon exemple de code JavaScript:

(Si vous avez besoin d'un style spécifique, je voudrais ajouter une classe au corps avec l'extrait JS suivant.)

var defectAndroid = $window.navigator && $window.navigator.userAgent.indexOf('534.30') > 0 && $window.navigator.userAgent.toLowerCase().match(/Android/);

if (defectAndroid) {
   // sample code specific for your Android Stock browser
}

(Quelques appareils Android signalant "Android", c’est pourquoi nous avons besoin de la conversation minuscule)

1
Peter MK

J'ai besoin de détecter Android Navigateur Internet pour ajouter des styles personnalisés car il ne semble pas gérer correctement le dimensionnement des boîtes. Le code que j'ai utilisé est basé sur la réponse de @Prakarangs qui ne fonctionnait pas pour moi. (Il n'a pas détecté le navigateur d'actions sur un Galaxy Note 2)

var navU = navigator.userAgent;
var isAndroidMobile = navU.indexOf('Android') > -1 && navU.indexOf('Mozilla/5.0') > -1 && navU.indexOf('AppleWebKit') > -1;
var regExAppleWebKit = new RegExp(/AppleWebKit\/([\d.]+)/);
var resultAppleWebKitRegEx = regExAppleWebKit.exec(navU);
var appleWebKitVersion = (resultAppleWebKitRegEx === null ? null : parseFloat(regExAppleWebKit.exec(navU)[1]));
var isAndroidStockBrowser = isAndroidMobile && (appleWebKitVersion !== null && appleWebKitVersion < 535);

Peut-être que cela est utile pour quelqu'un d'autre aussi.

1
tim-we

Vous n'obtenez pas Android dans l'agent utilisateur car vous utilisez la vue Bureau. Il n'y a apparemment aucun moyen d'identifier qu'il s'agit d'un appareil mobile dans ce mode. Une fois que vous passez en mode d'affichage normal, vous voyez le bon UA.

1
AsafK

Réf des réponses de Nick et efusien. Cela fonctionne pour moi avec Android OS 4.4.2

// Native Android Browser
var navU = navigator.userAgent;
var isAndroidMobile = navU.indexOf('Android') > -1 && navU.indexOf('Mozilla/5.0') > -1 && navU.indexOf('AppleWebKit') > -1;
var regExAppleWebKit = new RegExp(/AppleWebKit\/([\d.]+)/);
var resultAppleWebKitRegEx = regExAppleWebKit.exec(navU);
var appleWebKitVersion = (resultAppleWebKitRegEx === null ? null : parseFloat(regExAppleWebKit.exec(navU)[1]));
var regExChrome = new RegExp(/Chrome\/([\d.]+)/);
var resultChromeRegEx = regExChrome.exec(navU);
var chromeVersion = (resultChromeRegEx === null ? null : parseFloat(regExChrome.exec(navU)[1]));
var isAndroidBrowser = isAndroidMobile && (appleWebKitVersion !== null && appleWebKitVersion >= 537) && (chromeVersion !== null && chromeVersion < 29);

parce que maintenant sur KitKat, navigateur natif sur Android utilise WebKit 537.36 identique à Chrome lorsque nous enregistrons userAgent. En cochant aussi chromeVersion <29, je peux alors obtenir un message natif navigateur sous Android 4.4.2. (la version de Chrome sur mon Samsung S4 est maintenant à 40).

Voir dans ce lien WebKit tableau sur différents Android version: http://jimbergman.net/webkit-version-in-Android-version/

1
Prakarangs

Samsung Galaxy Note 3 en cours d'exécution Android 4.4.2 contient la chaîne d'UA suivante pour le navigateur Internet standard (pas Chrome ou tout autre navigateur):

Mozilla/5.0 (Linux; Android 4.4.2; en-us; SAMSUNG SM-N900 Build/KOT49H) AppleWebKit/537.36 (KHTML, like Gecko) Version/1.5 Chrome/28.0.1500.94 Mobile Safari/537.36

Samsung Galaxy S5 en cours d’exécution Android 4.4.2 contient la chaîne de l’utilisateur UA suivante pour le navigateur Internet standard (non Chrome ou autre navigateur):

Mozilla/5.0 (Linux; Android 4.4.2; en-gb; SAMSUNG SM-G900H Build/KOT49H) AppleWebKit/537.36 (KHTML, like Gecko) Version/1.6 Chrome/28.0.1500.94 Mobile Safari/537.36

Nous ne pouvons plus seulement rechercher AppleWebKit <537.

Je vérifie actuellement si AppleWebKit <537 OR Chrome <29 à l'aide de la méthode de l'utilisateur efusien.

1
Ian

Si vous avez besoin d'une expression régulière:

/Android[\s|/].+(AppleWebKit|Nokia)(.(?!Chrome|Presto|UCBrowser))+.$/gi
0
mcmimik