1. 介绍
开发者需要设备类别信号用于:-
为低端设备提供网站或特定组件的简化版本。示例:
-
提供 Google“简版搜索”——在新兴市场使用的、仅10KB的搜索结果页。
-
在 Facebook 提供简化版视频播放器。
-
在 Google 地图中提供轻量级的地图瓦片图片。
-
-
标准化分析指标:分析系统需要能够按设备类别标准化其统计数据。例如,在高端设备上耗时 100ms 的长任务问题会比在低端设备上更严重。
设备内存是判断“设备类别”的特别有用的信号。低内存设备(低于512MB,512MB-1GB)广泛用于新兴市场。
1.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 : 0.5 ...
2.
Sec- CH- Device- Memory(客户端提示)头字段
Sec 头字段是一个 HTTP 客户端提示头。
它是一个 结构化头值,内容为一个 元素,其值为 十进制数,表示客户端设备内存,即约等于的 RAM 容量,单位为 GiB。
Sec 头字段的
ABNF(增强型巴克斯-诺尔范式)语法如下:
Sec-CH-Device-Memory = sf-decimal
2.1. 设备内存值的计算
该值通过设备实际内存(MiB)计算,先取最接近且只有最高位为1其他位都为0的值(即最近的2的幂),再除以 1024.0 得到 GiB 单位的值。应该为该值列表设置上下界。
注意:虽然实现可选用不同的范围,但推荐上界为 8GiB,下界为 0.25GiB(即 256MiB)。
如果 Sec
头字段在消息中出现多次,最后一个值覆盖所有前面的值。
2.2. 示例
512 MiB 会被报告为:
Sec-CH-Device-Memory: 0.5
1000 MiB 会被报告为:
Sec-CH-Device-Memory: 1
一份完整的可能值列表为:0.25, 0.5, 1, 2, 4, 8
3. 设备内存 JS API
[
SecureContext ,
Exposed =(Window ,Worker )
] interface mixin NavigatorDeviceMemory {
readonly attribute double deviceMemory ;
};
Navigator includes NavigatorDeviceMemory ;
WorkerNavigator includes NavigatorDeviceMemory ;
注意: self 返回的是以 GiB 表示的内存大小,具体参考§ 2.1 设备内存值的计算
4. 安全注意事项
Sec 客户端提示头和 JS API 只对 HTTPS
安全上下文开放。
基于 User-Agent 及其他客户端特征进行设备识别和分类(如设备类型与类别)常用于为不同设备提供优化内容。此类方案常常依赖第三方设备数据库,成本高,集成复杂,维护困难。本规范定义了一种获取设备内存能力的机制,解决了这些技术难题。
为降低指纹识别风险,所报告的值会向下取整到最高有效位(而不是报告精确值),同时对取值施加上下界。
5. IANA 注意事项
本文定义了 Sec HTTP
请求头字段,并在永久消息头字段注册表([RFC3864])中注册。
5.1. Sec-CH-Device-Memory 头字段
- 头字段名称
-
Sec-CH-Device-Memory
- 适用协议
-
http
- 状态
-
standard
- 作者/变更控制方
-
IETF
- 规范文档
6. 致谢
特别感谢 所有贡献者,他们的技术意见和建议提升了本规范。