Apple iOS 13 发布后,我意识到window.navigator.userAgent
iPad iOS 13 上的 Safari 浏览器与 MacOS 上的相同。像这样的事情:
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/13.0 Safari/605.1.15
如您所见,这是 iPad 的错误用户代理,并且无法检测当前设备是否是 iDevice。
经过初步研究,我找到了解决方法:
转到设置 -> Safari -> 请求桌面网站 -> 所有网站。您注意到“所有网站”是默认启用。如果你disable它并获取 window.navigator.userAgent 现在显示正确的用户代理。
但我不能要求每个用户为每个设备进行此设置更改。所以我试图找到另一种方法,最后写了下面的代码检查它是否是 Safari、macOS 和触摸屏,那么该设备应该是苹果移动设备,但我想知道是否有更好的建议/方法来检测 Safari iOS 13 中的正确设备名称?
detectOs = function(){
//returns OS name, like "mac"
};
//is Safari on an apple touch-screen device
isSafariInIdevice = function(){
if (/Safari[\/\s](\d+\.\d+)/.test(windows.navigator.userAgent)) {
return 'ontouchstart' in window && detectOs() === "mac";
}
return false;
};
事实上,虽然“设置”中的选项更改对于用户来说可能是一个很好的解决方案,但作为开发人员,您不能依赖它。这就像要求用户不要使用深色模式一样奇怪,因为您的应用程序不支持它,而不是使用 plist 选择退出它。
对我来说,现在检测 iOS / iPad OS 设备最简单的方法:
const isIOS = /iPad|iPhone|iPod/.test(navigator.platform) ||
(navigator.platform === 'MacIntel' && navigator.maxTouchPoints > 1)
第一个条件是老式的,适用于以前的版本,
而第二个条件适用于 iPad OS 13,它现在将自己标识为:
"Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15) AppleWebKit/605.1.15 (KHTML, like Gecko)"
我所知道的所有平台检测器都没有检测到它(目前)既不是移动设备也不是桌面设备。
因此,由于 iPad OS 现在称自己为 Macintosh,但真正的 Mac 没有多点触控支持,因此该解决方案非常适合检测 iPad OS 设备,这些设备是现有的唯一多点触控“Macintosh”设备。
P.S.另外,您可能需要增强此检查,以排除 IE 被检测为 iOS 设备
const isIOS = (/iPad|iPhone|iPod/.test(navigator.platform) ||
(navigator.platform === 'MacIntel' && navigator.maxTouchPoints > 1)) &&
!window.MSStream
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)