检测 iOS
使用iOS 13 iPad both User agent and platform strings are changed 和differentiating 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 将是 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,请参阅 here 和 here。
注意:navigator.userAgent 和 navigator.platform 都可以被用户或浏览器扩展伪造。
存在用于更改 userAgent 或平台的浏览器扩展,因为网站使用过于严厉的检测并且经常禁用某些功能,即使用户的浏览器本来可以使用该功能。
为了缓和与用户之间的冲突,建议针对每种情况专门检测您网站所需的确切功能。然后,当用户获得具有所需功能的浏览器时,它已经可以工作而无需额外的代码更改。
检测 iOS 版本
检测iOS版本最常用的方法是parsing it from the User Agent string。但也有特征检测推断*;
我们知道 history API 是在 iOS4 中引入的 - iOS5 中的 matchMedia API - iOS6 中的 webAudio API - WebSpeech API 在 iOS7 等等。
注意:以下代码不可靠,如果这些 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';
}