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 -> 请求桌面网站 -> 所有网站。您注意到 默认情况下启用“所有网站”。如果 禁用 它并获取 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;
};
原文由 Saeid Amanzadeh 发布,翻译遵循 CC BY-SA 4.0 许可协议
事实上,虽然设置中的选项更改对用户来说可能是一个很好的解决方案,但作为开发人员,您不能依赖它。这就像要求用户不要使用暗模式一样奇怪,因为你的应用程序不支持它而不是使用 plist 选择退出它。
对于我来说,现在检测 iOS / iPad OS 设备最简单的方法是:
第一个条件是老式的,适用于以前的版本,而第二个条件适用于 iPad OS 13,它现在将自己标识为:
我知道的所有平台检测器都没有检测到(目前)既不是移动端也不是桌面端。
因此,由于 iPad OS 现在称自己为 Macintosh,但真正的 mac 不支持多点触控,因此该解决方案非常适合检测 iPad OS 设备,这是现存的唯一多点触控“Macintosh”设备。
PS 此外,您可能希望增加此检查以排除 IE 被检测为 iOS 设备