49

导航到http://whatsmyuseragent.com/显示我在运行 4.2.1 的 Galaxy Nexus 上的库存 Android 浏览器有用户代理

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

这个用户代理中没有任何东西可以让我唯一地检测到它是一个普通的 Android 浏览器。Chrome for Android 应用程序至少android在 UA 中有。我有什么方法可以检测到库存的 Android 应用程序吗?

4

14 回答 14

28
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);
于 2013-11-11T20:18:19.777 回答
17

"Android Browser" is the name of a browser. Confusing perhaps, but with a question like this, it shouldn't be. It's the browser that comes with the vast majority of Android devices, and he's obviously not talking about Chrome.

According to http://www.useragentstring.com/ this is the full list of Android Stock Browser strings. I am currently unsure whether there is a better way to select all of them at once, since some will continue to be added, and also which would not accidentally target Chrome on Android. Hopefully someone gives you a better answer as I am curious myself of the best way to go about this.

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
于 2013-03-26T21:23:43.233 回答
15

您可以通过在用户代理中查找“Android”并检查 AppleWebKit/### 版本号来区分普通浏览器和 Chrome 浏览器。

库存的 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% 可靠的,并且对于使用 WebView 的 Android 4.x 上的应用程序非常有用。

==详细信息(如果您想深入了解!)==

编辑 7:'AudioNode' in window可能是 AOSP(或旧 Chrome)与现代 Chrome 版本的安全嗅探。在这里试试。window.AudioNode 是作为 Chrome 29 中 WebAudio 支持的一部分引入的(并且不太可能被制造商向后移植)。我们的 4.0.3 手机上装有 Chrome 41,并'AudioNode' in window返回trueChrome 和falseAOSP。您还可以嗅探在 AOSP 完成开发后引入的其他功能——请参阅此链接以了解其他潜在的嗅探功能。选择 Chrome 42 之前引入的功能,因为 Android 4.0 用户无法升级到该版本。像往常一样使用 Android,肯定会出现奇怪的边缘情况,但这种嗅探可能与您所能获得的一样好(特别是如果结合检查 WebKit 版本 < 537)。

编辑 8:

==Android 上的 WebView==

在应用程序中使用 WebView 时,检查 <= 534 是一个完美的测试。Android 4.3(对 WebView 使用 AOSP 的最后一个 Android 版本)的兼容性定义表明,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(第一个使用 Chromium for WebView 的 Android 版本)的兼容性定义说 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)。

==Android 上的 AOSP==

对于设备上的浏览器(不是 WebView),用户代理不受兼容性定义的限制。实际使用的浏览器版本差异很大,如quirksmode三星浏览器版本所记录的那样。

编辑 4:推荐的解决方案是在用户代理中查找没有 Chrome 的 Android,如下所示:https ://developer.chrome.com/multidevice/user-agent#webview_user_agent但也可能需要确保不存在 /Windows Phone/ 因为 Mobile-IE11-8.1-Update 在 UA 中也有 Android " 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 显示 Windows Phone 上的 IE12 仍将在用户代理中使用 Android。

编辑 3:正如评论者所说,有 AOSP 和 >= 535 的设备,但这是我发现的最可靠的测试(我希望看到更好的东西)。如果嗅探失败,您可以尝试确保您的代码仍然有效,并接受 Android 碎片意味着会有奇怪的设备失败。买者自负。编辑 6:查看特定站点的一些数据,大约 1% 的看起来是 AOSP 登录有 WebKit 537,所以虽然它看起来相当可靠,但它绝对不是 100% 可靠的。

编辑 2:如果您在应用程序中使用 WebView,则此检测对于 Android >= 4.0 && Android < 4.4.4 很有用,因为即使设备上安装了 Chrome,WebView 组件也会使用 AOSP。

编辑 1:由于原生 android 现在已经“过时”,因此对其进行测试是合理的(并使用该标志来解决使用特征检测无法检测到的差异)。

于 2013-07-31T03:49:12.197 回答
5

到目前为止,还没有真正的方法可以检测到这一点。我目前使用的是 Android 4.2.2 库存 Galaxy S4 AT&T,默认浏览器现在在用户代理中有 Chrome(但仍然修复了 TouchWiz 位置问题)

在三星可以 a) 修复 touchwiz 或 b) 从 ua 字符串中删除 chrome 之前,我们没有真正的方法来检测 android 默认浏览器。我不能说这是否适用于所有 4.2x + 手机,但这对于需要制造/浏览器特定查询的开发团队来说是一个大问题。

我是一个活跃的移动端网络应用开发团队的一员,似乎 TouchWiz 对正在开发的不同方面造成了很多问题。

另一个问题是有像 Dolphin(很棒的浏览器,糟糕的 UA)这样的公司,在所有这些情况下,它们都会作为默认浏览器弹出,因为它不提供“dolphin”字符串并使用 AppleWebKit534x


同样关于用户代理字符串中的 U ,它与什么浏览器无关。事实上,这与每个浏览器使用的加密方法有关(通常是基于位置的标准)

“在美国创建的 Web 浏览器,例如 Netscape Navigator 和 Internet Explorer,使用字母 U、I 和 N 来指定用户代理字符串中的加密强度。直到 1996 年,当美国政府不允许使用更长的密钥进行加密时超过 40 位要导出,供应商提供了具有不同加密强度的各种浏览器版本。“U”代表“美国”(128 位加密的版本),“I”代表“国际”——浏览器有 40-位加密,可以在世界任何地方使用——“N”(事实上)代表“None”(不加密)。[10] 随着出口限制的解除,大多数供应商都支持 256 位加密。

来源:http ://en.wikipedia.org/wiki/User_agent#Encryption_strength_notations

于 2013-12-13T17:49:25.873 回答
3

efusien 的回答(2013 年 11 月 11 日 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's Android's native browser (and not Chrome), so do something
    }
});
于 2014-08-06T01:52:45.537 回答
2

看起来“Linux; U; Android”的存在是股票浏览器的一致差异化因素。谁知道“U”是什么意思,但我怀疑它将来会不可靠。希望当字符串发生变化时,浏览器要么消失,要么开始像 Chrome 一样播放。下面是其他一些字符串以供比较

Android Chrome:“Mozilla/5.0 (Linux; Android 4.1.2; SAMSUNG-SGH-I727 Build/JZO54K) AppleWebKit/537.36 (KHTML, like 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, like Gecko) Chrome/28.0.1500.63 Mobile Safari/537.36 OPR/15.0.1162.61541”

于 2013-08-15T17:15:08.367 回答
1

运行 Android 4.4.2 的三星 Galaxy Note 3 具有以下用于库存“Internet”浏览器(不是Chrome 或任何其他浏览器)的 UA 字符串:

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

运行 Android 4.4.2 的三星 Galaxy S5 具有以下用于库存“Internet”浏览器(不是Chrome 或任何其他浏览器)的 UA 字符串:

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。

我目前正在使用用户 efusien 的方法检查 AppleWebKit < 537 或 Chrome < 29。

于 2015-03-06T20:20:47.123 回答
1

如果您可以选择 JavaScript 而不是服务器端 UA 嗅探,请尝试(!!window.chrome) && (!window.chrome.app). 但是,我不能保证这个是“安全的”,会“永远”工作,或者类似的东西。将其视为仅用于测试目的的邪恶黑客。

说明:Chrome(或 Chromium?)浏览器(嗯,我在这里测试的那些,是 Cyanogenmod 10 上的 Chrome 和 Android 库存)有一个名为 的对象window.chrome,但在我至少测试过的 Android 库存浏览器上,这个对象确实没有app财产。

编辑:似乎较旧的 Chrome 版本会在此解决方案中出现误报。反过来,新版本的股票浏览器很可能会给出“假阴性”。

于 2013-06-18T15:56:00.193 回答
1

我想你正在寻找这个:

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 设备报告“android”,这就是我们需要小写对话的原因)

于 2014-11-03T16:12:23.770 回答
1

您没有进入androidUA,因为您使用的是桌面视图。似乎无法确定这是该模式下的移动设备。切换到普通视图后,您将看到正确的 UA。

于 2014-02-06T10:33:28.567 回答
1

参考尼克和 efusien 的答案。这适用于我的 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);

因为现在在 Kitkat 上,当我们登录 userAgent 时,Android 上的原生浏览器使用与 Chrome 相同的 WebKit 537.36。通过检查 chromeVersion < 29 然后我可以在 Android 4.4.2 上获得本机浏览器。(我的三星 S4 上的 Chrome 版本现在是 40)。

请参阅此链接中不同 Android 版本的 WebKit 表:http: //jimbergman.net/webkit-version-in-android-version/

于 2015-05-13T06:21:12.373 回答
1

我需要检测 Android Stock Browser 以添加一些自定义样式,因为它似乎无法正确处理 box-sizing。我使用的代码是基于@Prakarangs 的答案,这对我不起作用。(它没有检测到 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);

也许这对其他人也有帮助。

于 2015-05-22T00:20:46.470 回答
1

如果需要正则表达式:

/Android[\s|/].+(AppleWebKit|Nokia)(.(?!Chrome|Presto|UCBrowser))+.$/gi
于 2019-05-31T19:18:06.747 回答
-2

您必须从您的正则表达式中删除 SamsungBrowser。

对于三星浏览器,您可以使用 SamsungBrowser/([0-9]*.[0-9]*) 或 Android.*SAMSUNG.*Version/([0-9]*.[0-9]*) 旧浏览器

http://developer.samsung.com/technical-doc/view.do?v=T000000203

于 2016-08-19T14:38:26.703 回答