【问题标题】:Tell iPadOS from macOS on the web在网络上从 macOS 告诉 iPadOS
【发布时间】:2019-10-27 22:44:43
【问题描述】:

iPadOS beta 上的 Safari 用户代理此时与 macOS 上的 Safari 完全相同。有没有其他方法可以区分 iPad 和 Mac?

iPad running iOS
Mozilla/5.0 (iPad; CPU OS 10_3_3 like Mac OS X) AppleWebKit/603.3.8 (KHTML, like Gecko) Version/10.0 Mobile/14G60 Safari/602.1

iPadOS, developer beta 1
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/13.0 Safari/605.1.15

iPadOS, beta 2, simulator
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/13.0 Safari/605.1.15

iPadOS, beta 3, (simulator)
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/13.0 Safari/605.1.15

iPadOS, developer beta 3
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/13.0 Safari/605.1.15

iPadOS, developer beta 4
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/13.0 Safari/605.1.15

iPadOS 13.1, developer beta 1
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/13.0 Safari/605.1.15

iPadOS 13.1, developer beta 2
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/13.0 Safari/605.1.15

iPadOS 13.1, developer beta 3
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/13.0.1 Safari/605.1.15

iPadOS 13.1, developer beta 4
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/13.0.1 Safari/605.1.15

macOS Catalina 
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/13.0 Safari/605.1.15

macOS (older version)
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/12.1.1 Safari/605.1.15

macOS Catalina developer beta 7
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/13.0 Safari/605.1.15

macOS Catalina developer beta 8
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/13.0.1 Safari/605.1.15

播放 HLS 视频时,iPadOS 代理似乎是:

AppleCoreMedia/1.0.0.17A5821e (iPad; U; CPU OS 13_1 like Mac OS X; en_us)

【问题讨论】:

  • 我想知道这是否真的是这里提到的另一种“欺骗”案例。 stackoverflow.com/a/7976057/129202
  • 我添加了下一个 macOS Catalina 的用户代理。请注意,它完全与 iPadOS 相同。
  • 我认为你不能???目前我的解决方案是,如果用户代理显示 10.15,则显示一个弹出窗口询问是 iPadOS 还是 macOS。
  • 也在寻找这个问题的解决方案,我唯一能看到的可能有用的是: Navigator.standalone From developer.mozilla.org/en-US/docs/Web/API/Navigator: "返回一个布尔值,指示浏览器是否以独立模式运行。仅适用于 Apple 的 iOS Safari。”试图让一台 macOS 10.15 的机器查看它是否在桌面 safari 上返回一个值,但在我的 10.14 macOS safari 上它是未定义的。在我的模拟器中返回 10.15 iOS/ipadOS 中的值

标签: macos safari mobile-safari user-agent ipados


【解决方案1】:

我正在使用这个测试客户端:

   if (navigator.userAgent.match(/Mac/) && navigator.maxTouchPoints && navigator.maxTouchPoints > 2) {
     ...must be iPad OS...

由于没有适用于 Mac 的官方触摸屏,因此看起来相当安全。 iPad 上 maxTouchPoints 的实际值是 5,顺便说一句。

【讨论】:

  • 对于那些说这不重要(使用流畅的网页设计!)的人来说,如果用户需要从 Mac Store 安装 Safari 应用程序/扩展程序或使用 iOS 共享扩展程序,这很重要。我需要提供正确的链接和方向。
  • 我更喜欢这个答案。像魅力一样工作。
  • Chrome 上的 iPad 仿真仅支持 1 个 maxTouchPoints,因此除非您不打算使用 Chrome 进行调试,否则我建议您放弃 > 2 检查。
  • 尽管今年在 Mac 上使用了 Apple Silicon,但我对 Mac 端触摸屏的恐惧毕竟是不需要的 ✌? 啊,除非使用 sidecar 时存在触摸属性?
【解决方案2】:

我一般不会推荐这个,而且我没有对它进行太多测试(自 2019 年 9 月以来在生产中使用类似的东西),但一种方法可能是检测 TouchEvent 的存在客户端,并将其与用户代理的状态相匹配,以说明 iPad:s 的旧 iOS 版本。 YMMV。未来可能不太安全。

function isIpad() {
    const ua = window.navigator.userAgent;
    if (ua.indexOf('iPad') > -1) {
        return true;
    }

    if (ua.indexOf('Macintosh') > -1) {
        try {
            document.createEvent("TouchEvent");
            return true;
        } catch (e) {}
    }

    return false;
}

【讨论】:

  • isIpad() 在 MBP (Catalina) 上的 Chrome 85 上返回 true,无需触摸
【解决方案3】:

我用这个很好用:

const ua = window.navigator.userAgent.toLowerCase();
const isiPad = ua.indexOf('ipad') > -1 || ua.indexOf('macintosh') > -1 && 'ontouchend' in document;

【讨论】:

  • 只检查 userAgent 是不够的。也许navigator.maxTouchPoints > 2 是一个足够好的权宜之计。
【解决方案4】:

正如@Jonny 提到的,您可以尝试检测触摸事件,这是我目前使用的解决方案

function isTouchDevice() {
  if (typeof window === 'undefined') return false
  const prefixes = ' -webkit- -moz- -o- -ms- '.split(' ')
  function mq(query) {
    return typeof window !== 'undefined' && window.matchMedia(query).matches
  }
  if ('ontouchstart' in window || (window?.DocumentTouch && document instanceof DocumentTouch)) return true
  const query = ['(', prefixes.join('touch-enabled),('), 'heartz', ')'].join('') // include the 'heartz' - https://git.io/vznFH
  return mq(query)
}

detecting touch events 上的有趣帖子

另一个注意事项,Ipad 上的 Firefox 使用相同的 safari 用户代理:/

【讨论】:

  • isTouchDevice()(5 月 24 日版本)在没有触摸的 MBP (Catalina) 上的 Chrome 85 上返回 true。也许navigator.maxTouchPoints > 2 是一个足够好的权宜之计。
猜你喜欢
  • 1970-01-01
  • 2021-02-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-04-29
  • 1970-01-01
  • 2018-11-24
  • 1970-01-01
相关资源
最近更新 更多