小编典典

检测设备是否为 iOS

all

我想知道是否可以检测浏览器是否在 iOS 上运行,类似于如何使用 Modernizr 进行功能检测(尽管这显然是设备检测而不是功能检测)。


阅读 137

收藏
2022-03-11

共1个答案

小编典典

检测 iOS

在iOS 13 iPad中,用户代理和平台字符串都发生了变化,iPad 和 MacOS
之间的区别似乎是可能的
,所以下面的所有答案现在都需要考虑到这一点。

这可能是涵盖 iOS 13 的最短替代方案:

function iOS() {
  return [
    'iPad Simulator',
    'iPhone Simulator',
    'iPod Simulator',
    'iPad',
    'iPhone',
    'iPod'
  ].includes(navigator.platform)
  // iPad on iOS 13 detection
  || (navigator.userAgent.includes("Mac") && "ontouchend" in document)
}

iOS将是truefalse

更糟糕的选择:用户代理嗅探

用户代理嗅探更危险,问题经常出现。

在 iPad iOS 13 上,用户代理与 MacOS 13 计算机的用户代理相同 ,但如果您忽略 iPad,这可能会持续一段时间:

var iOS = !window.MSStream && /iPad|iPhone|iPod/.test(navigator.userAgent); // fails on iPad iOS 13

!window.MSStream是为了不错误地检测到
IE11,请参见此处此处

注意: 两者navigator.userAgentnavigator.platform都可以被用户或浏览器扩展伪造。

存在用于更改 userAgent 或平台的浏览器扩展,因为网站使用过于严厉的检测并且经常禁用某些功能,即使用户的浏览器本来可以使用该功能。

为了降低与用户的冲突,建议针对每种情况专门检测您网站所需的确切功能。然后,当用户获得具有所需功能的浏览器时,它已经可以工作而无需额外的代码更改。

检测 iOS 版本

检测 iOS 版本的最常见方法是从 User Agent字符串中解析它。但也有 特征 检测推断*;

我们知道在 iOS4 - iOS5 - iOS6 - iOS7 等中history API引入的事实。 matchMedia API webAudio API WebSpeech API

注意: 以下代码不可靠,如果这些 HTML5 功能中的任何一个在较新的 iOS 版本中被弃用,就会中断。你被警告了!

function iOSversion() {

  if (iOS) { // <-- Use the one here above
    if (window.indexedDB) { return 'iOS 8 and up'; }
    if (window.SpeechSynthesisUtterance) { return 'iOS 7'; }
    if (window.webkitAudioContext) { return 'iOS 6'; }
    if (window.matchMedia) { return 'iOS 5'; }
    if (window.history && 'pushState' in window.history) { return 'iOS 4'; }
    return 'iOS 3 or earlier';
  }

  return 'Not an iOS device';
}
2022-03-11