如何检测Android浏览器的库存

时间:2013-01-18 16:56:51

标签: android user-agent android-browser

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

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

此用户代理中没有任何内容可以让我唯一地检测到它是一个Android浏览器。适用于Android的Chrome应用至少在UA中有android。我有什么方法可以检测到Android应用程序的存在吗?

14 个答案:

答案 0 :(得分: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);

答案 1 :(得分:16)

“Android Browser”是浏览器的名称。也许会感到困惑,但是有了这样的问题,它不应该。它是绝大多数Android设备附带的浏览器,他显然不是在谈论Chrome。

根据http://www.useragentstring.com/,这是Android Stock Browser字符串的完整列表。我目前不确定是否有更好的方法可以同时选择所有这些内容,因为有些内容会继续添加,而且不会在Android上意外定位Chrome。希望有人能给你一个更好的答案,因为我很好奇自己最好的方法。

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

答案 2 :(得分:13)

您可以通过在useragent中查找“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版本之间的安全嗅探。 Try it here。 window.AudioNode是作为Chrome 29中WebAudio支持的一部分引入的(并且不太可能被制造商反向移植)。我们的4.0.3手机上有Chrome 41,'AudioNode' in window为Chrome提供true,为AOSP提供false。您还可以嗅探AOSP完成开发后引入的其他功能 - 请参阅this link了解其他潜在功能。选择Chrome 42之前推出的功能,因为Android 4.0用户无法升级该版本。像往常一样,Android肯定存在奇怪的边缘情况,但是嗅探可能与你能得到的一样好(特别是如果结合检查WebKit版本&lt; 537)。

编辑8:

== Android上的WebView ==

在应用程序中使用WebView时,检查&lt; = 534是一个完美的测试。 compatibility definition for Android 4.3(最后一个使用AOSP for WebView的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”。

compatibility definition for 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),用户代理不会被兼容性定义禁止。使用的实际浏览器版本与documented上的quirksmodeSamsung browser version中记录的https://developer.chrome.com/multidevice/user-agent#webview_user_agent差异很大。

编辑4:建议的解决方案是在用户代理中查找不含Chrome的Android:https://msdn.microsoft.com/en-us/library/hh869301(v=vs.85).aspx但是也可能需要确保没有/ Windows Phone /因为Mobile-IE11-8.1-更新还在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”中安装了Android。编辑5:{{3}}表明Windows Phone上的IE12仍将在用户代理中安装Android。

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

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

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

答案 3 :(得分:4)

截至目前,没有真正的方法来检测这一点。我目前在Android 4.2.2股票Galaxy S4 AT&amp; 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”代表“USA”(对于具有128位加密的版本),“I”代表“International” - 浏览器具有40位加密功能,可以在世界任何地方使用 - “N”代表(事实上)“无”(无加密)。[10]在解除出口限制后,大多数供应商都支持256位加密。 “

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

答案 4 :(得分:3)

efusien的回答(11月11日和13:20在20:18)对我有用,虽然没有声明变量,并且使用了逗号一个点而不是分号,导致任何寻找复制/粘贴答案的人都失败

以下是对我有用的内容,包括使用&#34的实际示例;如果它是本机浏览器&#34;条件:

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
    }
});

答案 5 :(得分: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,与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”

答案 6 :(得分:1)

如果您选择使用JavaScript代替服务器端UA嗅探,请尝试使用(!!window.chrome) && (!window.chrome.app)然而,我不能保证这个“安全”,“永远”,或类似的东西。将它视为仅用于测试目的的恶意黑客。

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

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

答案 7 :(得分:1)

由于您正在使用桌面视图,因此您未在UA中获得android。似乎无法确定这是该模式下的移动设备。一旦你切换到普通视图,你就会看到正确的UA。

答案 8 :(得分: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设备报告&#39; android&#39;这就是我们需要小写会话的原因)

答案 9 :(得分:1)

运行Android 4.4.2的三星Galaxy Note 3具有以下用于股票的UA字符串&#39; Internet&#39;浏览器( 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

运行Android 4.4.2的三星Galaxy S5具有以下UA字符串,用于股票&#39;互联网&#39;浏览器( 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&lt; 537了。

我目前正在检查AppleWebKit&lt; 537 OR Chrome&lt; 29使用用户efusien的方法。

答案 10 :(得分:1)

来自Nick's和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&lt; 29然后我可以在Android 4.4.2上获得原生浏览器。 (我的三星S4上的Chrome版本现在是40)。

在此链接中查看不同Android版本的WebKit表: http://jimbergman.net/webkit-version-in-android-version/

答案 11 :(得分:1)

我需要检测Android Stock Browser以添加一些自定义样式,因为它似乎没有正确处理盒子大小。 我使用的代码基于@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);

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

答案 12 :(得分:0)

如果您需要正则表达式:

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

答案 13 :(得分:-2)

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

对于SamSungBrowser,您可以使用 旧浏览器的SamsungBrowser /([0-9] *。[0-9] *)或Android。* SAMSUNG。*版本/([0-9] *。[0-9] *)

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