安卓手机浏览器检测

6
我有一个网络应用程序,移动电话用户可以看到经过优化的移动网站。新的三星Galaxy SIII用户代理未提供任何提示,表明请求来自移动电话。检测移动电话的最佳实践是什么?
我知道JavaScript功能检测(例如modernizer),但希望得到更好的解决方案。以下是三星Galaxy SIII用户代理:
Mozilla/5.0(X11; Linux x86_64)AppleWebKit/534.24(KHTML,like Gecko)Chrome/11.0.696.34 Safari/534.24
编辑:SIII有两种可能的用户代理。以上是“桌面”版本。有趣的东西。有关详细信息,请参见下面的链接。

http://www.anandtech.com/Show/Index/5310?cPage=19&all=False&sort=0&page=5&slug=samsung-galaxy-nexus-ice-cream-sandwich-review

3个回答

3

看到那个用户代理,我得说,这要和非手持设备区分是极其困难的。

浏览器检测的问题在于很容易调整用户代理字符串,因此你永远不知道服务器告诉你的是否真实。

在这种情况下,你有两个选择:

  • 你可以检查手机发送的每个标头,并可能找到一个可以使其独特的标头。

  • 或者通过测试页面加载时间等方式找到某种解决方法。作为一个奇思妙想的例子,手持设备上的浏览器通常比桌面版本渲染页面慢一些,所以在测试了像这样的每个可能的移动设备之后:

-

if( /Android|webOS|iPhone|iPad|iPod|BlackBerry/i.test(navigator.userAgent) ) {
 // some code..
}

如果一个页面只包含简单的脚本却不能在理想时间内加载,你可以看到这一点。

你明白了。

另外,试着访问这里并查看它是否能检测到你:http://detectmobilebrowsers.com/


Patrick,感谢您的快速回复。很遗憾,安卓手机没有像苹果设备那样清晰地标识自己。detectmobilebrowsers.com看起来正是我要找的东西,让我试试。 - SemanticZen
@SemanticZen,这里有一个jsFiddle,内置了detectmobilebrowsers插件,使用的是jQuery 2012年7月版本。该fiddle修订版为5,但请注意之前的fiddle使用了不同的版本。干杯! - arttronics
arttronics,谢谢你的样例。当我在三星Galaxy SIII手机上访问这个样例时,它会显示为移动端。但是,当我将userAgent以字符串形式作为测试输入时,它却不能正常工作。这是一个问题,因为我需要测试不在我桌面上的设备。http://jsfiddle.net/bjCJu/ - SemanticZen
我的问题在于有时三星SIII看起来像一部手机,有时又不像。就像有时你想吃坚果,有时你又不想... - SemanticZen
嗯,试试这个jsFiddle,它带有Firebug Mini和一个你可以查看的console.log消息。你可能需要使用Firebug Mini清除按钮,确保访问Console Tab。然后点击控制台中动态填充的针对您特定设备的Object。也就是说,您将看到插件了解您的三星手机的所有信息。 - arttronics

2
"桌面模式"用户代理旨在使网站服务器在用户有意选择使用桌面模式时,不会提供移动/平板界面-从用户的角度来看,这是一个可用性反模式,因为它剥夺了用户的选择权。
如果您*必须*覆盖用户的选择,则在JavaScript中(截至2013年),如果满足以下所有条件,则很可能是Android设备:
1. 'ontouchstart' in document.documentElement 2. navigator.vendor === 'Google Inc.' 3. /^Linux armv/.test(navigator.platform) 然而,以上方法在某些不常见的浏览器设置中可能会产生误报或漏报,例如基于ARM的ChromeBook带有触摸屏,例如在Linux上运行的Chromium与ARM处理器(尽管可能是Linux / ARM)等。例如其他浏览器Firefox / Opera等,例如不具备触摸功能的Android设备,如电视,例如Chrome是否可以在带有ARM处理器的Windows RT上运行?例如在英特尔上运行的Android。"

0

我必须要检测“桌面视图”,所以类似于robocat的答案,这是我用来检测“桌面视图”的方法。虽然不完美,但它似乎提供了避免误报的正确平衡:

if (userAgent.indexOf('X11; Linux x86_64') !== -1 
      && 'ontouchstart' in document.documentElement 
      && /^Linux armv/.test(navigator.platform) 
      && _constructor.isChrome) {
      if ((window.outerWidth < 500 && window.outerHeight < 800) || (window.outerWidth < 800 && window.outerHeight < 500)) {
                // do stuff.
            }
  }

帮助我决定宽度/高度过滤器应该是什么

http://mydevice.io/devices/ http://viewportsizes.com/?filter=


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接