Php 仅检测带有“的移动用户”;“桌面模式”;浏览器

Php 仅检测带有“的移动用户”;“桌面模式”;浏览器,php,jquery-mobile,mobile,user-experience,Php,Jquery Mobile,Mobile,User Experience,我知道有很多方法可以检测手机用户(主要是通过检查用户代理) 但许多移动浏览器都有所谓的“桌面模式”,这为网站提供了更多的功能环境 是否有办法仅向这些移动用户提供特定功能(例如jQuery滑块),并在此模式下浏览?我面临的真正问题是,从本质上讲,他们的用户代理在两种模式下都是相同的(例如“Opera Mini 9.0.1”),因此从网站管理员的角度来看——我如何知道他们在移动设备上,但在桌面模式下浏览网站?在Android Chrome上,“桌面模式”从用户代理中删除“Android”字符串。如果

我知道有很多方法可以检测手机用户(主要是通过检查用户代理)

但许多移动浏览器都有所谓的“桌面模式”,这为网站提供了更多的功能环境

是否有办法仅向这些移动用户提供特定功能(例如jQuery滑块),并在此模式下浏览?我面临的真正问题是,从本质上讲,他们的用户代理在两种模式下都是相同的(例如“Opera Mini 9.0.1”),因此从网站管理员的角度来看——我如何知道他们在移动设备上,但在桌面模式下浏览网站?

在Android Chrome上,“桌面模式”从用户代理中删除“Android”字符串。如果可以使用JavaScript,则以下内容主要用于检测Android Chrome桌面模式:

var webkitVer = parseInt(/WebKit\/([0-9]+)|$/.exec(navigator.appVersion)[1], 10); // also matches AppleWebKit
var isGoogle = webkitVer && navigator.vendor.indexOf('Google') === 0;  // Also true for Opera Mobile and maybe others
var isAndroid = isGoogle && userAgent.indexOf('Android') > 0;  // Careful - Firefox and Windows Mobile also have Android in user agent
var androidDesktopMode = !isAndroid && isGoogle && (navigator.platform.indexOf('Linux a') === 0) && 'ontouchstart' in document.documentElement;
它假设带有ARM处理器的Chrome是Android。对于在ARM上运行Linux的用户来说,这种假设肯定是失败的,对于在i686或MIPS上运行Android的用户来说,这种假设是失败的(而且我还没有能够测试ChromeOS)

对于Windows Mobile,您可以通过检查用户代理中的字符串“WPDesktop;”来检测桌面模式

编辑:用于使用
window.chrome
window.chrome.webstore
的代码,这是一个可靠的测试,但在chrome 65附近,您无法再使用这些属性来检测桌面模式。感谢@faks提供的信息

编辑2:我现在强烈建议不要将“桌面模式”视为“移动模式”,但以下是我的最新意见:

  • 请注意,桌面模式下的代码检测非常脆弱,较新的浏览器版本经常破坏嗅探代码技术

  • 除非你有一个严重的bug或者关键的可用性问题,否则它完全不值得去嗅探

  • 如果您没有积极维护代码并针对浏览器的beta版本进行测试,请不要嗅探

  • 我对iOS使用以下命令:
    navigator.vendor.indexOf('Apple')==0&&ontouchstart'在document.body
    中。我们需要它来为iPadOS 13(旧的navigator.platform技术现已在iOS 13测试版中被打破)正确设置令人惊讶的糟糕iOS输入模式,并避免其他输入类型的iOS可用性缺陷。我想你可以检查
    window.screen.width==768
    来嗅探iPad(即使方向改变也保持不变)。如果Macbook以触摸版面世,这种感觉就会消失

  • 我现在使用以下方法来检测Android桌面模式:
    document.body&&navigator.platform.indexOf('LinuxA')==0&&(window.chrome | |(window.Intl&&Intl.v8BreakIterator))
    。可怕的不可靠的嗅探,但我们确实需要它,因为android上的视口和收缩缩放(而不是页面缩放)在我们的SPA上真的被破坏了(屏幕大小不足以让桌面触摸用户使用一个小窗口)


    • 以下是iOS Safari用户的相关代码。实际上,用户代理在桌面模式下丢失了对iPhone/iPod/iPad的引用,但该信息仍存在于navigator.platform中:

      var iOSAgent = window.navigator.userAgent.match(/iPhone|iPod|iPad/);
      var iOSPlatform = window.navigator.platform && window.navigator.platform.match(/iPhone|iPod|iPad/);
      var iOSRequestDesktop = (!iOSAgent && iOSPlatform);
      

      “桌面模式”的全部意义在于防止特定于移动设备的内容。你甚至不应该试图改变这一点,我意识到这一点,但想象一下这种情况:你的网站检测(通过检查用户代理)用户是否正在通过一个已识别的移动设备列表进行访问。由于您知道站点上的某个特定功能在移动浏览器上不起作用(因为它具有悬停效果或类似效果),所以您可以将该功能全部隐藏起来。但是,该功能在使用“桌面模式”的移动设备上工作。我们是将其隐藏在此类设备上,还是尝试检测此模式并显示该功能?这就是我面临的困境。或者某个特定的移动浏览器充满了你必须解决的bug。无论它是否假装是桌面版本(没有bug),bug都存在+问题1。使用响应性设计。不管你认为它是桌面(鼠标)还是移动(触摸屏)浏览器,都要这样做,这样你就能更好地涵盖所有可能的情况。要检测
      isAndroid
      userAgent.indexOf('Android')
      应为
      navigator.userAgent.indexOf('Android')>-1
      ,否则返回错误。还有
      !(window.chrome | | window.chrome.webstore)
      在应该返回true的地方返回false,以便检测可以工作。你能再解释一下你为什么要检查
      window.chrome
      property吗?@Faks-你说得对,所以我已经把它修好了。Wierdly它在我的原始代码中是正确的,所以我一定是在为我的答案重写代码时塞满了东西!