使用 User-Agent 客户端提示检测Windows 11和 CPU 体系结构
网站可以使用User-Agent客户端提示 (UA-CH) 来区分Windows 11用户和Windows 10用户,并检测设备的 CPU 体系结构。 浏览器使用User-Agent客户端提示格式向网站提供用户代理信息。
网站还可以使用从浏览器发送的用户代理信息来检测如下信息:
- 浏览器品牌。
- 浏览器版本号。
- 运行浏览器的设备平台。
站点可通过两种方法访问用户代理信息:
- (旧) User-Agent字符串。
- 建议) (User-Agent客户端提示。
有关这两种方法的详细信息,请参阅 从网站检测 Microsoft Edge。
在 Microsoft Edge (和 Google Chrome) 中,站点可以通过User-Agent客户端提示 (UA-CH) 来区分Windows 11和Windows 10上的用户,并检测设备的 CPU 体系结构。 可以在以下 UA-CH 请求标头中找到此信息:
标头字段 | 指示Windows 10的值 | 指示Windows 11的值 |
---|---|---|
Sec-CH-UA-Platform |
Windows |
Windows |
Sec-CH-UA-Platform-Version |
和 之间的 1.0.0 值 10.0.0 |
13.0.0 及更高版本 |
User-Agent字符串不会更新为区分Windows 11和Windows 10,也不会区分 CPU 体系结构。 建议不要使用User-Agent字符串来检索用户代理数据。 不支持User-Agent客户端提示的浏览器将无法区分Windows 11和Windows 10,也无法区分 CPU 体系结构。
支持User-Agent客户端提示的浏览器
下表显示了哪些浏览器支持区分Windows 11和Windows 10,以及不同的 CPU 体系结构。
浏览器 | 支持通过User-Agent客户端提示进行区分? |
---|---|
Microsoft Edge 94+ | 是 |
Chrome 95+ | 是 |
Opera | 是 |
Firefox | 否 |
Internet Explorer 11 | 否 |
用于检测Windows 11的示例代码
以下代码检测Windows 11:
navigator.userAgentData.getHighEntropyValues(["platformVersion"])
.then(ua => {
if (navigator.userAgentData.platform === "Windows") {
const majorPlatformVersion = parseInt(ua.platformVersion.split('.')[0]);
if (majorPlatformVersion >= 13) {
console.log("Windows 11 or later");
}
else if (majorPlatformVersion > 0) {
console.log("Windows 10");
}
else {
console.log("Before Windows 10");
}
}
else {
console.log("Not running on Windows");
}
});
用于检测 ARM 或 x86 的示例代码
使用 CPU 体系结构检测让网站自动下载专为用户 CPU 生成的应用版本。
CPU 检测对于基于 ARM 的设备特别有用,因此使用 ARM 设备的客户会自动下载应用程序的本机 ARM 版本。 这可以防止用户无意中安装为 x86 生成的应用,然后因仿真而降低性能。
以下代码检测 CPU 体系结构:
navigator.userAgentData.getHighEntropyValues(["architecture", "bitness"])
.then(ua => {
if (navigator.userAgentData.platform === "Windows") {
if (ua.architecture === 'x86') {
if (ua.bitness === '64') {
console.log("x86_64");
}
else if (ua.bitness === '32') {
console.log("x86");
}
}
else if (ua.architecture === 'arm') {
if (ua.bitness === '64') {
console.log("ARM64");
}
else if (ua.bitness === '32') {
console.log("ARM32");
}
}
}
else {
console.log("Not running on Windows");
}
});
使用 优化检测性能 Critical-CH
目前,网站服务器必须将响应标头发送到 Accept-CH
浏览器客户端,以请求默认情况下未在标头中 Sec-CH-UA
发送的较高 entropy 字段。 下图显示了浏览器向服务器发送请求标头,包括 user agent: <UA string>
和接收响应标头,包括 Accept-CH: sec-ch-ua-platform
。
在此初始请求期间,客户端将记录 Accept-CH
首选项,并在后续请求中默认包括 sec-ch-ua-platform
。
为了进一步优化此流,除了标头之外Accept-CH
,还可以使用新的Critical-CH
标头来立即重新发出请求标头,而无需重新加载页面。 下图显示了浏览器向服务器发送请求标头,包括 user agent: <UA string>
和 接收响应标头,包括 Accept-CH: sec-ch-ua-platform
和 Critical-CH: sec-ch-ua-platform
。 然后,浏览器立即将请求标头发送到服务器。
从 Microsoft Edge 版本 96 开始,可以使用新 Critical-CH
标头接收具有优化性能的所需高 entropy 标头。
请记住, Critical-CH
在清除会话 Cookie 或用户清除给定来源的站点数据或 Cookie 之前,和 Accept-CH
首选项将一直保留。 有关 的详细信息 Critical-CH
,请参阅 客户端提示可靠性。
检测特定 Windows 版本
用户代理客户端提示草稿社区组报告中指定了navigator.userAgentData.getHighEntropyValues
由提示"platformVersion"
(API 返回的平台版本定义,Sec-CH-UA-Platform-Version
并通过标头) 。 在 Windows 10 及更高版本中,该值基于 Windows.Foundation.UniversalApiContract 版本。
若要检测特定版本的 Windows,请在 User-Agent 客户端提示中使用以下值 platformVersion
:
版本 | 的第一个版本组件 platformVersion |
---|---|
Win7/8/8.1 | 0 |
Win10 1507 | 1 |
Win10 1511 | 2 |
Win10 1607 | 3 |
Win10 1703 | 4 |
Win10 1709 | 5 |
Win10 1803 | 6 |
Win10 1809 | 7 |
Win10 1903 | 8 |
Win10 1909 | 8 |
Win10 2004 | 10 |
Win10 20H2 | 10 |
Win10 21H1 | 10 |
Win10 21H2 | 10 |
Win11 | 13+ |