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

通常情况下,我会倾向于功能检测,但我需要找出设备是否是iOS,因为根据问题YouTube API not working with iPad / iPhone / non-Flash device,设备处理视频的方式

推荐答案

Detecting iOS

iOS 13 iPad both User agent and platform strings are changeddifferentiating between iPad and MacOS seems possible,所以下面的所有答案现在都需要考虑到这一点.

这可能是也涵盖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

更糟糕的 Select :用户代理嗅探

用户代理嗅探比较危险,问题也经常出现.

On iPad iOS 13, the user agent is identical with that of a MacOS 13 computer,但如果你忽略iPad,这可能会持续一段时间:

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

!window.MSStream是为了不错误地检测IE11,参见herehere.

Note:用户或浏览器扩展都可以伪造navigator.userAgentnavigator.platform.

存在用于更改用户代理或平台的浏览器扩展,是因为网站使用了过于繁重的检测,并且经常禁用某些功能,即使用户的浏览器本来可以使用该功能.

为了减少与用户的冲突,建议针对每个 case 专门检测您的网站所需的确切功能.然后,当用户获得具有所需功能的浏览器时,它将在不需要额外代码更改的情况下工作.

Detecting iOS version

检测IOS版本的最常用方法是通过parsing it from the User Agent string检测.但也有feature detection inference*

我们知道history API是在iOS4-matchMedia API年,iOS5-webAudio API年,iOS6-WebSpeech API年,iOS7年等等.

Note:以下代码不可靠,如果这些HTML5功能中的任何一个在较新的iOS版本中被弃用,这些代码将被 destruct .你被警告了!

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

Javascript相关问答推荐

如何在NightWatch.js测试中允许浏览器权限?

主要内部的ExtJS多个子应用程序

无法将nPM simplex-noise包导入在JS项目中工作

vanillajs-datepicker未设置输入值,日期单击时未触发更改事件

我在这个黑暗模式按钮上做错了什么?

如何在Connect 4游戏中 for each 玩家使用位板寻找7形状?

使搜索栏更改语言

康威的生活游戏规则在我的Javascript版本中不起作用.''我做错了什么?

正则表达式,允许我匹配除已定义的子字符串之外的所有内容

以Angular 实现ng-Circle-Progress时出错:模块没有导出的成员

一个实体一刀VS每个实体多刀S

每次重新呈现时调用useState initialValue函数

删除元素属性或样式属性的首选方法

Next.js无法从外部本地主机获取图像

在GraphQL解析器中修改上下文值

Plotly.js栏为x轴栏添加辅助文本

如何检测当前是否没有按下键盘上的键?

相对于具有选定类的不同SVG组放置自定义工具提示

用内嵌的含selenium的Java脚本抓取网站

Google OAuth 2.0库和跨域开放程序的问题-策略错误