Как определить фондовый браузер Android
Переход на http://whatsmyuseragent.com/ показывает мне мой Android-браузер на моем Galaxy Nexus, работающем 4.2.1, имеет пользовательский агент
Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/534.24 (KHTML, like Gecko) Chrome/11.0.696.34 Safari/534.24
В этом пользовательском агенте нет ничего, что позволяет мне однозначно определить, что это Android-браузер. Приложение Chrome для Android по крайней мере имеет android
в UA. Есть ли способ обнаружить Android-приложение для акций?
Ответы
Ответ 1
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);
Ответ 2
"Android Browser" - это имя браузера. Может быть, сбивать с толку, но с таким вопросом этого не должно быть. Это браузер, который поставляется с подавляющим большинством устройств Android, и он явно не говорит о Chrome.
Согласно http://www.useragentstring.com/, это полный список строк Android Stock Browser. В настоящее время я не уверен, есть ли лучший способ выбрать все из них сразу, поскольку некоторые будут продолжать добавляться, а также не будут случайно нацелены на Chrome на Android. Надеюсь, кто-то даст вам лучший ответ, поскольку мне любопытно, как лучше всего это сделать.
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
Ответ 3
Вы можете узнать разницу между браузером акций и браузером Chrome, выбрав "Android" в useragent и проверив номер версии AppleWebKit/###.
В Android-браузере Android никогда не было выше 534, а Chrome - 537 или выше.
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;
Это 99% надежный и очень полезный для приложения на Android 4.x с помощью WebView.
== детали (если вы хотите глубже!) ==
Изменить 7: 'AudioNode' in window
- это, вероятно, безопасное средство для AOSP (или старого Chrome) по сравнению с современными версиями Chrome. Попробуйте здесь. window.AudioNode был представлен как часть поддержки WebAudio в Chrome 29 (и вряд ли он будет возвращен производителями). На нашем телефоне 4.0.3 есть Chrome 41, а 'AudioNode' in window
возвращает true
для Chrome и false
для AOSP. Вы также можете понюхать другие функции, появившиеся после завершения AOSP-разработки - см. эту ссылку для других потенциальных возможностей, чтобы нюхать. Выберите функцию, представленную до Chrome 42, потому что пользователи Android 4.0 не могут обновить эту версию. Как обычно в Android, наверняка будут странные крайние случаи, но этот снифф, вероятно, так же хорош, как вы можете получить (особенно в сочетании с проверкой версии WebKit < 537).
Изменить 8:
== WebView на Android ==
Проверка на <= 534 - отличный тест при использовании WebView в приложении. определение совместимости для Android 4.3 (последняя версия Android для использования AOSP для WebView), говорит, что пользовательский агент WebView ДОЛЖЕН быть: "Mozilla/5.0 (Linux; U; Android $(VERSION); $(LOCALE); $(MODEL) Build/$(BUILD)) AppleWebKit/534.30 (KHTML, like Gecko) Version/4.0 Mobile Safari/534.30
".
определение совместимости для Android 4.4 (первая версия Android для использования Chromium для WebView), говорит, что пользовательский агент WebView ДОЛЖЕН быть: 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
".
Меньше, чем Android 4.3, очень похоже на определение 4.3 (всегда AOSP). Больше 4.4 очень похоже на определение 4.4 (всегда Chromium).
== AOSP на Android ==
Для браузера на устройстве (не WebView) пользовательский агент не запрещен определением совместимости. Фактическая используемая версия браузера сильно варьируется, поскольку документально на quirksmode и как описано для версия браузера Samsung.
Редактировать 4: Рекомендуемое решение - искать Android без Chrome в пользовательском агенте, как: https://developer.chrome.com/multidevice/user-agent#webview_user_agent, однако он может также необходимо для обеспечения отсутствия /Windows Phone/, поскольку Mobile-IE11-8.1-Update также имеет Android в 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
". Изменить 5: https://msdn.microsoft.com/en-us/library/hh869301(v=vs.85).aspx показывает, что IE12 на Windows Phone по-прежнему будет содержать Android в пользовательском агенте.
Edit 3: Как заявили комментаторы, есть устройства там с AOSP и >= 535, но это самый надежный тест, который я нашел (мне бы хотелось увидеть что-то лучше). Вы можете попытаться убедиться, что ваш код по-прежнему функционирует, если sniff не удается, и принять, что фрагментация Android означает, что будут нечетные устройства, которые не работают. Пусть покупатель будет бдителен. Редактирование 6: Если посмотреть на некоторые данные для определенного сайта примерно на 1% того, что выглядит как логин AOSP, есть WebKit 537, поэтому, хотя он кажется довольно надежным, он определенно не на 100% надежен.
Изменить 2: Если вы используете WebView в приложении, это обнаружение полезно для Android >= 4.0 && & Android < 4.4.4, поскольку компонент WebView использует AOSP, даже если Chrome установлен на устройстве.
Изменить 1: Поскольку родной андроид теперь "устарел", разумно протестировать его (и использовать флаг для устранения различий, которые невозможно обнаружить с помощью обнаружения функции).
Ответ 4
В настоящее время нет истинного метода для обнаружения этого. Я в настоящее время на Android 4.2.2 запаса Galaxy S4 AT & T, и браузер по умолчанию теперь имеет Chrome в пользовательском агенте (но все еще имеет проблемы с TouchWiz фиксированной позиции)
Пока Samsung не может: a) исправить touchwiz или b) удалить chrome из строки ua, у нас нет истинного метода обнаружения браузера по умолчанию Android. Я не могу сказать, если это относится ко всем телефонам 4.2x +, но это большая проблема для разработчиков команд, требующих специфических запросов для производства/браузера.
Я обособленно от активной группы разработчиков мобильных веб-приложений, и, похоже, TouchWiz вызывает множество проблем для разработки различных аспектов.
Другой проблемой являются такие компании, как Dolphin (отличный браузер, ужасный UA), который во всех этих случаях будет всплывать в качестве браузера по умолчанию, поскольку он не предоставляет строку "дельфина" и использует AppleWebKit534x
Также относительно U в строке user-agent он не имеет никакого отношения к тому, что браузер. Infact это связано с тем, что метод шифрования используется для каждого браузера (обычно стандартно на основе местоположения).
"Веб-браузеры, созданные в Соединенных Штатах, такие как Netscape Navigator и Internet Explorer, используют буквы U, я и N, чтобы указать силу шифрования в строке пользовательского агента. До 1996 года, когда правительство Соединенных Штатов отказалось от шифрования с ключами длиной более 40 бит, которые будут экспортированы, поставщики отправили различные версии браузера с различной прочностью на шифрование." U "означает" США "(для версии с 128-битным шифрованием)," I "означает" Международный "- браузер имеет 40-битное шифрование и может использоваться в любой точке мира - и" N "стоит (де-факто) для" Нет "(без шифрования). [10] После отмены ограничений на экспорт большинство поставщиков поддерживают 256-битное шифрование."
Источник: http://en.wikipedia.org/wiki/User_agent#Encryption_strength_notations
Ответ 5
efusien answer (ноябрь 11,13 в 20:18) работает для меня, хотя переменная не была объявлена, а запятая была использована в одном месте вместо точки с запятой, , что приводит к большому сбою для всех, кто ищет ответ для копирования/вставки.
Следующее - это то, что сработало для меня, включая практический пример с условием "если это родной браузер":
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 Android native browser (and not Chrome), so do something
}
});
Ответ 6
Похоже, присутствие "Linux; U; Android" является последовательным отличием для браузера акций. Кто знает, что означает "U", но я подозреваю, что это будет ненадежным в будущем. Будем надеяться, что браузер либо уйдет, либо начнет играть, как Chrome, когда строки меняются. Некоторые другие строки ниже для сравнения
Android Chrome:
"Mozilla/5.0 (Linux, Android 4.1.2, SAMSUNG-SGH-I727 Build/JZO54K) AppleWebKit/537.36 (KHTML, например, 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, например, Gecko) Chrome/28.0.1500.63 Mobile Safari/537.36 OPR/15.0.1162.61541"
Ответ 7
Если для вас вариант JavaScript, а не серверный нюанс UA, попробуйте (!!window.chrome) && (!window.chrome.app)
.
Я не могу гарантировать, однако, что этот "безопасен", будет работать "навсегда" или что-то в этом роде. Считайте это злым взломом, который будет использоваться только для целей тестирования.
Объяснение: Браузеры Chrome (или Chromium?) (ну, те, которые я тестировал здесь, которые были в Chrome и Android на Cyanogenmod 10), имеют объект с именем window.chrome
, но в браузере Android Android, который я тестировал по крайней мере, этот объект не имеет свойства app
.
Изменить: похоже, что старые версии Chrome предоставят ложные срабатывания с этим решением. В свою очередь, более новые версии браузера акций, скорее всего, дадут "ложные негативы".
Ответ 8
Вы не получаете android
в UA, потому что используете Desktop View. Кажется, нет способа определить, что это мобильное устройство в этом режиме. Когда вы переключитесь на обычный режим просмотра, вы увидите правильный UA.
Ответ 9
Я думаю, вы ищете это:
Собственный браузер Android не обновлен выше версии 534.30, поэтому вы можете фильтровать версию и комбинацию символов Android UA (выше мы можем предположить, что браузер Chrome)
Вот мой пример кода JavaScript:
(Если вам нужен специальный стиль, я бы добавил класс в тело со следующим фрагментом JS)
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
}
(Некоторые Android-устройства сообщают "андроид", почему нам нужен разговор в нижнем регистре)
Ответ 10
Samsung Galaxy Note 3 под управлением Android 4.4.2 имеет следующую строку UA для браузера "Интернет" (не Chrome или любого другого браузера):
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 под управлением Android 4.4.2 имеет следующую строку UA для браузера "Интернет" (не Chrome или любого другого браузера):
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
Мы можем не только проверить AppleWebKit < 537.
Сейчас я проверяю, будет ли AppleWebKit < 537 или Chrome < 29 с использованием пользовательского метода efusien.
Ответ 11
Ссылка на ответы Ника и Эфузена.
Это работает для меня с ОС Android 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);
потому что теперь в Kitkat собственный браузер на Android использует WebKit 537.36 так же, как Chrome, когда мы регистрируем userAgent.
Проверяя также chromeVersion < 29 затем я могу получить собственный браузер на Android 4.4.2. (Версия Chrome на моем Samsung S4 теперь составляет 40).
См. в этой ссылке таблицу WebKit в разных версиях Android:
http://jimbergman.net/webkit-version-in-android-version/
Ответ 12
Мне нужно обнаружить Android Stock Browser, чтобы добавить некоторые пользовательские стили, потому что он, похоже, неправильно обрабатывает размер окна.
Код, который я использовал, основан на ответе @Prakarangs, который не работал у меня.
(Он не обнаружил браузер запаса в примечании к галактике 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);
Возможно, это тоже полезно для кого-то другого.
Ответ 13
Вы должны удалить SamsungBrowser из своего регулярного выражения.
Для SamSungBrowser вы можете использовать
SamsungBrowser/([0-9] *. [0-9] *) или Android. * SAMSUNG. * Версия /([0-9] *. [0-9] *) для старого браузера
http://developer.samsung.com/technical-doc/view.do?v=T000000203