如何检测股票Android浏览器

导航到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浏览器。 Chrome for Android应用程序至less在UA中有android 。 有没有什么办法来检测股票Android应用程序?

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

“Android Browser”是浏览器的名称。 也许令人困惑,但是这样的问题不应该是这样的。 这是绝大多数Android设备的浏览器,他显然不是在谈论Chrome。

根据http://www.useragentstring.com/这是Android股票浏览器string的完整列表。; 我目前不确定是否有更好的方法来一次select所有的,因为一些将继续被添加,并且也不会意外地瞄准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 

您可以通过在useragent中查找“Android”并检查AppleWebKit / ###版本号来区分股票浏览器和Chrome浏览器。

股票的Android浏览器从来没有超过534,铬是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对于Chrome返回true ,对于AOSP则返回false 。 您也可以嗅探AOSP完成开发后引入的其他function – 查看此链接以了解其他潜在function。 selectChrome 42之前推出的function,因为Android 4.0用户无法升级到该版本。 像往常一样使用Android,肯定会出现一些奇怪的边缘情况,但是这种嗅探可能与您所能得到的一样好(尤其是在检查WebKit版本<537时)。

编辑8:

== Android上的WebView ==

检查<= 534是在应用程序中使用WebView时的完美testing。 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 “。

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中logging的版本有很大差异,而且三星浏览器版本中也有logging 。

编辑4:推荐的解决scheme是按照https://developer.chrome.com/multidevice/user-agent#webview_user_agent在用户代理中查找没有Chrome的Android,但是也可能需要确保没有/ Windows手机/因为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的设备,但这是我发现的最可靠的testing(我希望看到更好的东西)。 你可以尝试确保你的代码在sniff失败的情况下仍然有效,并且接受Android碎片意味着会有奇怪的设备出现故障。 买者自负。 编辑6:查看某个特定站点的一些数据约有1%的AOSPlogin有WebKit 537,所以虽然看起来相当可靠,但绝对不是100%可靠的。

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

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

目前还没有真正的方法来检测这一点。 我目前在Android 4.2.2股票Galaxy S4 AT&T和默认浏览器现在在用户代理Chrome(但仍然有固定的TouchWiz问题)

直到三星可以a)修复touchwiz或b)从uastring中删除铬,我们没有真正的方法来检测android默认浏览器。 我不能说所有的4.2x +手机都是这种情况,但对于需要制造/浏览器特定查询的开发团队而言,这是一个大问题。

我是一个活跃的移动端networking应用程序开发团队,看来TouchWiz在开发不同方面会引发很多问题。

另一个问题是有像Dolphin(伟大的浏览器,可怕的UA),在所有这些情况下,会popup作为默认浏览器,因为它不提供“海豚”string,并使用AppleWebKit534x


另外关于用户代理string中的U,它与什么浏览器无关。 事实上,这与每个浏览器使用的encryption方法有关(通常是基于位置的标准)

“在美国创build的网页浏览器(如Netscape Navigator和Internet Explorer)使用字母U,I和N来指定用户代理string中的encryption强度,直到1996年美国政府禁止用密钥encryption“U”代表“USA”(128位encryption版本),“I”代表“国际” – 浏览器拥有40位以上的encryption优势,并且可以在全球任何地方使用 – 而“N”代表(事实上)代表“无”(不encryption)。[10]随着出口限制的解除,大多数供应商都支持256位encryption。

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

efusien的答案(13年11月11日在20:18)为我工作 ,虽然一个variables没有被宣布,逗号被用于一个地方,而不是一个分号, 这导致任何人想要一个副本/粘贴答案

以下是我的工作,包括使用“如果是本机浏览器”条件的实际示例:

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

它看起来像“Linux; U; Android”的存在是股票浏览器的一致的区别。 谁知道“U”是什么意思,但是我怀疑将来会不可靠。 希望浏览器会在string改变时离开或开始像Chrome一样玩。 其他一些string在下面进行比较

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“

如果JavaScript而不是服务器端UA嗅探是一个选项,请尝试(!!window.chrome) && (!window.chrome.app)然而,我不能保证这个“安全”,会“永远”工作,或类似的东西。 认为这只是一个邪恶的黑客,只能用于testing目的。

说明:Chrome(或Chromium?)浏览器(我在这里testing的是Cyanogenmod 10上的Chrome和Android版本)有一个名为window.chrome的对象,但在我的Android股票浏览器中,这个对象没有app属性。

编辑:看起来像旧的Chrome版本会给这个解决scheme误报。 反过来,较新版本的股票浏览器很可能会给出“假阴性”。

你没有在UA中获取android ,因为你正在使用桌面视图。 似乎没有办法确定这是在这种模式下的移动设备。 一旦你切换到正常的视图,你会看到正确的UA。

我想你正在寻找这个:

Android原生浏览器没有更新到534.30以上的版本,所以你可以过滤到的版本和Android UAstring组合(上面我们可以推定它是一个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 4.4.2的Samsung Galaxy Note 3具有以下用于股票“Internet”浏览器( 不包括 Chrome或任何其他浏览器)的UAstring:

 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的Samsung Galaxy S5具有以下用于股票“互联网”浏览器( 不包括 Chrome或任何其他浏览器)的UAstring:

 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。

来自Nick's和efusien的回答。 这适用于我的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上,当我们loginuserAgent的时候,Android上的本地浏览器使用和Chrome相同的WebKit 537.36。 通过检查chromeVersion <29,那么我可以在Android 4.4.2上获得原生浏览器。 (我现在三星S4上的Chrome版本是40)。

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

我需要检测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); 

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

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

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

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