据我所知,iPad 使用的是 iPhone OS,但屏幕分辨率与 iPhone 和 iPod touch 不同。如此多的网站可能不得不改变他们的用户代理检测以适应 iPad。
那么,任何有权访问 iPad 或 iPad SDK 的人都可以给我们用户代理字符串吗?
据我所知,iPad 使用的是 iPhone OS,但屏幕分辨率与 iPhone 和 iPod touch 不同。如此多的网站可能不得不改变他们的用户代理检测以适应 iPad。
那么,任何有权访问 iPad 或 iPad SDK 的人都可以给我们用户代理字符串吗?
Mozilla/5.0(iPad; U; CPU iPhone OS 3_2 like Mac OS X; en-us) AppleWebKit/531.21.10 (KHTML, like Gecko) Version/4.0.4 Mobile/7B314 Safari/531.21.10
(差不多 10 年后……)
从iOS 13开始,iPad 的用户代理已更改为 Mac OS,例如:
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15) AppleWebKit/605.1.15 (KHTML, like Gecko) 版本/13.0 Safari/605.1.15
在模拟器中,在 iPad 模式下:
Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10_5_8; en-us) AppleWebKit/531.9 (KHTML, like Gecko) 版本/4.0.3 Safari/531.9(这是针对 3.2 beta 1 的)Mozilla/5.0 (iPad; U; CPU OS 3_2 like Mac OS X; en-us) AppleWebKit/531.21.10 (KHTML, like Gecko) Version/4.0.4 Mobile/7B334b Safari/531.21.10 (这是 3.2 beta 3)
在 iPhone 模式下:
Mozilla/5.0 (iPhone; U; CPU iPhone OS 3_2 like Mac OS X; en-us) AppleWebKit/531.21.20 (KHTML, like Gecko) Mobile/7B298g
我不知道模拟器有多可靠,但您似乎无法仅从用户代理字符串检测设备是否为 iPad。
(注意:我在 Snow Leopard 上,Safari 的用户代理字符串是
Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10_6_2; en-us) AppleWebKit/531.21.8 (KHTML, like Gecko) 版本/4.0.4 Safari/531.21.10
)
从真实设备:
Mozilla/5.0 (iPad; U; CPU OS OS 3_2 like Mac OS X; en-us) AppleWebKit/531.21.10 (KHTML, like Gecko) Version/4.0.4 Mobile/7B367 Safari/531.21.10
值得注意的是,在 web-app 模式下运行时(使用apple-mobile-web-app-capable
元标记),用户代理从以下位置更改:
Mozilla/5.0 (iPad; U; CPU OS 3_2_1 like Mac OS X; en-us) AppleWebKit/531.21.10 (KHTML, like Gecko) Version/4.0.4 Mobile/7B405 Safari/531.21.10
到:
Mozilla/5.0 (iPad; U; CPU OS 3_2_1 like Mac OS X; en-us) AppleWebKit/531.21.10 (KHTML, like Gecko) Mobile/7B405
4.3.5 下的 iPad 2:
Mozilla/5.0 (iPad; U; CPU OS 4_3_5 like Mac OS X; en-us) AppleWebKit/533.17.9 (KHTML, like Gecko) Version/5.0.2 Mobile/8L1 Safari/6533.18.5
我的说:
Mozilla/5.0 (iPad; U; CPU OS 4_3 like Mac OS X; da-dk) AppleWebKit/533.17.9 (KHTML, like Gecko) Version/5.0.2 Mobile/8F190 Safari/6533.18.5
干得好!
Mozilla/5.0 (iPad; U; CPU OS 3_2 like Mac OS X; en-us) AppleWebKit/531.21.10 (KHTML, like Gecko) Version/4.0.4 Mobile/7B334b Safari/531.21.10
似乎普遍的共识是,每个移动苹果设备、iphone、ipad 或 ipod 都使用包含“Mobile”和“Safari”的用户代理。
但是,使用最新的 SDK (4.0.1) 并读取我的 rails 服务器上的用户代理(使用request.env["HTTP_USER_AGENT"]
),我们永远不会得到“Safari”部分。
无论请求是来自模拟器还是真实设备,调试或发布,它总是看起来像这样:
Mozilla/5.0 (iPhone; U; CPU iPhone OS 3_1_2 like Mac OS X; de-de) AppleWebKit/528.18 (KHTML, like Gecko) Mobile/7D11"
只是没有'Safari'。:-( 所以我们必须使用“iPhone”部分来确定。这是苹果不推荐做的事情。
从 iOS 13 开始,找不到“iPad”,我使用这个 js current-device,它可以工作。
这个核心:
const iPadOS13Up = navigator.platform === 'MacIntel' && navigator.maxTouchPoints > 1
https://github.com/matthewhudson/current-device/blob/master/src/index.js#L55
你可以看到你死了类型: http: //matthewhudson.github.io/current-device/
从模拟器 3.2 最终版:
Mozilla/5.0 (iPad; U; CPU OS 3_2 like Mac OS X; en-us) AppleWebKit/531.21.10 (KHTML, like Gecko) Version/4.0.4 Mobile/7B367 Safari/531.21.10
iPhone OS 3.2 SDK beta 3 中 iPad 用户代理字符串上的 Safari:
Mozilla/5.0 (iPad; U; CPU OS 3_2 like Mac OS X; en-us) AppleWebKit/531.21.10 (KHTML, like Gecko) Version/4.0.4 Mobile/7B334b Safari/531.21.10
更多信息:http: //developer.apple.com/library/safari/#technotes/tn2010/tn2262/_index.html
我认为值得一提的是,您通常不需要使用整个代理字符串,除非您找到了需要将网站定制为特定模型的原因。
您可以在代理字符串中检查 iPhone、iPad 和 iPod,并覆盖您的所有基地。
if((navigator.userAgent.match(/iPhone/i)) || (navigator.userAgent.match(/iPod/i)) || (navigator.userAgent.match(/iPad/i))) {
appleMobileDevice = true;
}
else {
appleMobileDevice = false;
}
由于 Apple 非常有帮助地在 iOS 中更改了他们的 userAgent 字符串,因此您不能再可靠地为 ipad/iphone 使用正则表达式。
我建议为旧版和当前 iOS 版本 ( /i(?:pad|phone)|mac os/i
) 使用正则表达式的组合,并额外检查navigator.maxTouchPoints
. maxTouchPoints 在 Macbook 上始终为 0,但在 iPad、iPhone 上大于 0(通常为 5)。
如果您进一步需要区分 iPad 和 iPhone,您可以使用window.outerWidth
并window.outerHeight
获取视口大小和方向。这只会有很大帮助,因为一些较大的 iPhone 的视口比最小的 iPad 还要大。
谢谢,苹果!
仅适用于 iPad
Mozilla/5.0 (iPad; U; CPU OS 3_2 like Mac OS X; en-us) AppleWebKit/531.21.10 (KHTML, like Gecko) Version/4.0.4 Mobile/7B334b Safari/531.21.10