我想知道是否可以检测浏览器是否在 iOS 上运行,类似于如何使用 Modernizr 进行功能检测(尽管这显然是设备检测而不是功能检测)。
在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将是true或false
iOS
true
false
用户代理嗅探更危险,问题经常出现。
在 iPad iOS 13 上,用户代理与 MacOS 13 计算机的用户代理相同 ,但如果您忽略 iPad,这可能会持续一段时间:
var iOS = !window.MSStream && /iPad|iPhone|iPod/.test(navigator.userAgent); // fails on iPad iOS 13
这!window.MSStream是为了不错误地检测到 IE11,请参见此处和此处。
!window.MSStream
注意: 两者navigator.userAgent和navigator.platform都可以被用户或浏览器扩展伪造。
navigator.userAgent
navigator.platform
存在用于更改 userAgent 或平台的浏览器扩展,因为网站使用过于严厉的检测并且经常禁用某些功能,即使用户的浏览器本来可以使用该功能。
为了降低与用户的冲突,建议针对每种情况专门检测您网站所需的确切功能。然后,当用户获得具有所需功能的浏览器时,它已经可以工作而无需额外的代码更改。
检测 iOS 版本的最常见方法是从 User Agent字符串中解析它。但也有 特征 检测推断*;
我们知道在 iOS4 - iOS5 - iOS6 - iOS7 等中history API引入的事实。 matchMedia API webAudio API WebSpeech API
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'; }