如何躲过iPadOS偷偷改了userAgent的坑

983 阅读1分钟

概述

据说,从 19 年 iPadOS 发布后(首版应该是 iPadOS13),苹果偷偷修改了iPadOS 的 userAgent。目的是实现“请求桌面网站”,让 iPad 更像一台 PC 电脑,而不是一台加大码的手机。

对比 12、13 两个版本的 userAgent 差异如下:

iPad iOS13.5,  
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_4) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/13.1.1 Safari/605.1.15  

iPad iOS12.4.6,  
Mozilla/5.0 (iPad; CPU OS 12_4_6 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/12.1.2 Mobile/15E148 Safari/604.1 

从13开始,iPad设备获取的userAgent值中不再包含 iPad 字段了,而变成了Macintosh 字段

解决方案

参考《User-Agent如何判断识别iPad设备》,这位大神的方案,亲测比较靠谱

这里借鉴记录一下,避免后续找不到了

function isiPad() {
    return (/macintosh|mac os x/i.test(navigator.userAgent) && window.screen.height > window.screen.width && !navigator.userAgent.match(/(iPhone\sOS)\s([\d_]+)/)) || navigator.userAgent.match(/(iPad).*OS\s([\d_]+)/);
}

核心思路是:iPad的屏幕高始终>屏幕宽,而Mac的宽>高

另外,测试过,zeptojs 库的 detect 函数也是不能正确识别出 iPadOS13 以上的版本

还有,如果是在 app 中嵌套的 WKWebView,也可以让 App 的同事在创建WKWebView之前手动把显示模式改成移动端模式,让userAgent回退到包含"iPad"字段的版本,这样 100%是正确的,但相对没那么灵活,而且这招仅限于在 app 中嵌套的 WKWebView 的场景。