1. 简介
设备类别信号被用于多种原因,包括:
-
提供网站或特定组件的轻量版本:这有助于为低端设备定制网站。例如:
-
提供“精简搜索”——一个专为低端设备使用的10KB搜索结果页。
-
在社交媒体网页应用中提供视频播放器的轻量版本。
-
在地图类网页应用中提供轻量级的切片图片。
-
-
规范化度量标准:分析需要能够针对设备类别规范化其度量。例如,100毫秒的长任务在高端设备上比在低端设备上是更严重的问题。
基于公开的User以及客户端其他特征进行设备识别与分类,常用于选择并提供优化的内容。这类方案往往依赖于商业设备数据库,而这些数据库价格昂贵,集成困难且维护成本高。
本规范定义了(客户端提示)头字段及JavaScript API,它们公开了近似的设备内存(RAM)信息,以无需设备数据库的方式满足这些需求。
2. 计算设备内存值
-
令physicalDeviceMemory为物理内存字节数。
-
令minimumLowerBound为实现自定义的最低边界。
-
令maximumUpperBound为实现自定义的最大边界。
-
令deviceMemory等于physicalDeviceMemory/1024.0。
-
令power为0。
-
当deviceMemory大于1时循环:
-
按位右移deviceMemory一位。
-
power加1。
-
-
令lowerBound为2的power次方。
-
令upperBound为2的|power + 1|次方。
-
如果physicalDeviceMemory − lowerBound ≤ upperBound − physicalDeviceMemory,则deviceMemory的值为lowerBound。
-
否则deviceMemory的值为upperBound。
-
如果deviceMemory < minimumLowerBound,则deviceMemory为minimumLowerBound。
-
如果deviceMemory > maximumUpperBound,则deviceMemory为maximumUpperBound。
-
返回deviceMemory。
本算法允许实现自定义的最大边界和最小边界。这两个边界范围应包含大部分设备的内存值,但应排除罕见的内存值以减少设备指纹风险。实现可随着时间调整这些边界,这些边界在不同类型设备间也可不同。
3.
Sec- CH- Device- Memory(客户端提示)头字段
Sec头字段是HTTP客户端提示头。它是结构化头值,包含一个项,其值为十进制数,用于指示客户端大致拥有的设备内存(RAM)容量(单位:GiB)。
如果`Sec`头字段在一个消息中出现多次,则最后一个值覆盖所有先前出现的值。
该`Sec`头字段的ABNF(扩充巴克斯-诺尔范式)语法如下:
Sec-CH-Device-Memory = sf-decimal
`Sec`的值应设置为用户代理的deviceMemory。
3.1. 客户端提示示例
Sec- CH- Device- Memory`HTTP客户端提示,使用Accept- CH头字段或带http-equiv属性的等效HTML meta元素来表示支持:
Accept-CH: Sec-CH-Device-Memory
随后,在接收到服务器的上述偏好设置后,兼容的用户代理会通过`Sec`请求头字段通知设备的内存能力:
GET /example HTTP / 1.1 Sec-CH-Device-Memory : 8 ...
4. 设备内存JavaScript API
[
SecureContext ,
Exposed =(Window ,Worker )
] interface mixin NavigatorDeviceMemory {
readonly attribute double deviceMemory ;
};
Navigator includes NavigatorDeviceMemory ;
WorkerNavigator includes NavigatorDeviceMemory ;
NavigatorDeviceMemory
的
deviceMemory
getter 步骤是返回 用户代理 的 deviceMemory。
4.1. JavaScript 示例
网页应用可以根据设备内存启用或禁用功能。
注意:网页应用应考虑如何处理不支持该API的浏览器:要么默认启用,要么默认禁用。
const mem= navigator. deviceMemory; // 如果已知为低内存设备,可禁用功能提升体验 if ( mem&& mem< 2 ) { // 禁用功能以提升体验 } // 或者,仅当设备内存未知或已知高于最低要求时才启用功能 if ( ! mem|| mem> 4 ) { // 启用功能以提升体验 }
navigator. deviceMemory API查询设备内存,并将其作为补充信息包含在性能 beacon
中,以帮助解释或细分数据。
const mem= navigator. deviceMemory; const analyticsData= { memory: mem; ... 其他指标} navigator. sendBeacon( "/endpoint" , analyticsData);
5. 安全与隐私注意事项
`Sec`客户端提示头和JavaScript
API仅适用于HTTPS安全上下文。
为减少指纹识别风险,报告的值会四舍五入到仅保留一位有效比特,而不是上报精确值。此外,实现可能会对上报值施加特定的最大和最小边界。随着常用设备内存特性改变,这些边界也应定期审核。定义这些边界时应考虑设备类型,因为移动设备与台式机、笔记本的特性通常不同。
6. IANA注意事项
本文档定义了`Sec`HTTP请求头字段,并将其注册到永久消息头字段注册表([RFC3864])。
6.1. Sec- CH- Device- Memory
头字段
- 头字段名称
-
Sec-CH-Device-Memory
- 适用协议
-
http
- 状态
-
standard
- 作者/变更控制者
-
IETF
- 规范文档
7. 致谢
特别感谢前任编辑Shubhie Panicker以及所有贡献者,感谢他们的技术意见和建议,使本规范得以改进。