iOS 13 上的 Safari 未显示正确的用户代理时如何检测设备名称?

新手上路,请多包涵

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 许可协议

阅读 924
2 个回答

事实上,虽然设置中的选项更改对用户来说可能是一个很好的解决方案,但作为开发人员,您不能依赖它。这就像要求用户不要使用暗模式一样奇怪,因为你的应用程序不支持它而不是使用 plist 选择退出它。

对于我来说,现在检测 iOS / iPad OS 设备最简单的方法是:

 let 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”设备。

PS 此外,您可能希望增加此检查以排除 IE 被检测为 iOS 设备

let isIOS = (/iPad|iPhone|iPod/.test(navigator.platform) ||
(navigator.platform === 'MacIntel' && navigator.maxTouchPoints > 1)) &&
!window.MSStream

原文由 kikiwora 发布,翻译遵循 CC BY-SA 4.0 许可协议

const isIOS = !!(/iPad|iPhone|iPod/.test(navigator.platform)
  || (navigator.platform === "MacIntel" && typeof navigator.standalone !== "undefined"))

作为已接受答案的替代方案,我发现您可以使用 navigator.standalone 参数。它是非标准的,目前仅在 iOS Safari 上使用:

Navigator.standalone

返回一个布尔值,指示浏览器是否以独立模式运行。仅适用于 Apple 的 iOS Safari。

当与 navigator.platform === "MacIntel" iPad 结合使用时,iPad 是唯一定义此属性的设备,因此 typeof navigator.standalone !== "undefined" 过滤掉运行 Safari(触摸屏或非触摸屏)的 Mac。

原文由 GuyC 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题