OpenPWA 证据分层
发布于
看到一条关于 Web 平台特性的说法,你会想知道它是文档里写的、演示里能看到的,还是有人拿真机测出来的。“OpenPWA 证据分层”就是给每条结论标上这两样信息:它属于哪一层(支持、能力、行为),背后实际是哪类证据。
这里是最新的 1.0 版,2026-10-20 发布。当天发布的原文原样保存在 1.0 版,之后的改动记在版本历史里。完整论文另外收了已有工作、参考文献和命名附录。
支持层回答浏览器有没有这个特性、从哪个版本开始有。能力层回答它能做什么,配一个你可以直接运行的演示。行为层回答它在指定设备、系统版本号和启动场景下实际怎么表现,结论来自 OpenPWA 的一次实测。三层各有对应的证据类别,分别是文档记载、演示可见和真机实测。实测结果以带日期的条件挂到相关的支持行上,上游来源原样保留。openpwa.net 的真机测试结果都发布在真机实验室。
兼容数据早就有注释和“部分支持”,演示站早就在展示能力,从业者也一直在发设备笔记。这套框架做的事,是给它们之间的界线起了名字,逐条结论按证据分级,再把已安装应用的行为单独列为一层,定下这一层自己的证据要求。哪些是前人做过的、哪些是新的,完整论文里有交代。
三个层级
链接到“三个层级”一节“结论”指关于某个 Web 平台特性、读者可以据以行动的一条陈述。它回答什么问题,就归哪一层,一条结论只归一层。证据类别看实际支撑它的是什么,也只标一个。
| 第 1 层 支持 | 第 2 层 能力 | 第 3 层 行为 | |
|---|---|---|---|
| 回答的问题 | 支持吗?从哪个版本开始? | 能做什么?给我看看。 | 在这台设备、这个系统版本号、这个场景下,究竟会发生什么? |
| 来源 | browser-compat-data(BCD)、规范、厂商文档、发布说明与博客 | OpenPWA 在 /demo/ 下的可运行演示 |
在指定真机上按公开流程完成、带日期的运行 |
| 证据类别 | 文档记载 | 演示可见 | 真机实测(原生);来源描述过的行为记为文档记载 |
| 展示时附带 | 来源名称与核对日期 | 演示链接,措辞请你在自己的设备上试一试 | 日期、设备、系统版本与版本号、测试套件版本、置信标签和数据链接 |
| 出现在哪里 | 兼容表、参考页的可用性横幅 | /demo/ 与“去试试”链接 |
真机实验室的行为参考页,兼容行上的脚注 |
| 分级 | 方法论里由来源算出的置信度(high、medium、low) | 不分级,演示只能说明做得到,说明不了支持情况 | A(仪器读数)或 S(截图或录屏) |
| 单位 | 特性 × 浏览器 × 版本范围 | 特性 × 演示 | 行为 × 设备 × 系统版本号 × 场景 × 日期 |
支持类结论照来源的说法,写某个特性在指定浏览器和版本范围内有、没有、部分有、要开标志位,还是已经移除。来源自己写明的可用条件(“仅限主屏 Web 应用”“需要用户激活”)也算在支持类结论里,因为它们划定了“支持”在哪里成立。支持类结论全部来自来源,所以这一层只有文档记载。OpenPWA 转述并交叉核对这些说法,自己不写。如果 OpenPWA 的某次实测和某条支持说法有关,实测结果仍然是行为记录,以关系的形式挂到那一行上。
能力类结论说某个特性能完成某件事,并且有一个可运行的页面去试,比如请求权限、设置角标、分享文件、订阅推送。它只说明这件事做得到。演示在你手机上跑出什么结果,是你自己的观察。OpenPWA 按测试流程把一次演示运行记录下来,得到的是一条行为记录,能力结论并不因此变强。
行为类结论写特性在给定条件下实际怎么表现。输入冲突时听谁的,缺了输入用什么默认值,主屏应用和浏览器标签页有什么不同,时机和生命周期,几何和渲染,还有容易踩的坑,都属于这一层。实测得来的行为结论一定写明设备、系统版本与版本号、场景和日期。来源描述过、OpenPWA 还没跑过的行为,显示为 由<来源>记载,OpenPWA 未实测。比如 WebKit 在 Safari 17.2 的说明里提到,新添加的主屏 Web 应用会复制 Cookie。没人实测之前,这就是一条文档记载的行为结论。
怎样判定一条结论属于哪一层
链接到“怎样判定一条结论属于哪一层”一节按下面的顺序问,哪一步答“是”就停在哪一步。
- 这条结论是不是在说特性用起来会发生什么,或者结果怎样随设备、系统版本、启动场景或状态而变(取值、优先级、默认值、时机、生命周期、渲染、提示框)?是的话,归第 3 层“行为”。OpenPWA 按测试流程跑过的算真机实测,来源里写的算文档记载。
- 是不是在说特性能完成某件事,指向一个可运行的页面,但没有记录在案的运行?是的话,归第 2 层“能力”,证据类别是演示可见。
- 是不是在说特性能不能用、在哪里能用、从什么时候起能用(有无、版本、标志位、部分支持、来源写明的可用条件)?是的话,归第 1 层“支持”,证据类别是文档记载。如果这条结论出自 OpenPWA 的运行而不是来源,就回到第 1 步,它是挂在那一行上的行为记录。
- 都不是的话,它不算平台结论。把它标成建议、历史或观点,或者删掉。
同一句里混了两层(“16.4 起支持,并且只在主屏应用中触发”),就拆成每层一条。运行得出的版本号(“在 18.6.2 上可用”)只是某一个版本号上的行为结论,不能拿来定 version_added。演示在你的设备上跑不通,那是你的观察,要按测试流程复现以后才算 OpenPWA 的结论。
三类证据
链接到“三类证据”一节文档记载的结论出自 OpenPWA 以外的来源,包括规范、厂商文档、发布说明、厂商工程博客、厂商 bug 跟踪系统和 BCD。展示时附上来源和核对日期。BCD 的数据哪怕是自动采集来的,也算文档记载,因为 OpenPWA 没有亲眼看到。从业者博客、论坛这类第三方笔记同样算文档记载,按方法论里的 high、medium、low 规则给较低的置信度。
演示可见的结论背后有一个可运行的 OpenPWA 演示在调用这项能力。展示时附演示链接,措辞请你在自己的设备上试一试。这个标签只说明演示存在,而且就是为调用这个特性做的,不表示它在任何一台具体设备上可用。
真机实测的结论来自 OpenPWA 在指定真机上按公开测试流程跑的一次运行。只有以置信标签 A 或 S 发布的运行才能标这一类。
真机实测要记录什么
链接到“真机实测要记录什么”一节一次运行要把下面每一项都记下来,才算真机实测。
- 环境信息,包括设备名称与型号标识、系统版本与版本号、发布渠道、浏览器版本、语言与地区、非默认的功能标志、内容拦截器或 VPN 状态,用了检查主机的话也要写明是哪台。
- 整次运行和每次读取的日期、时间与时区。
- 场景,即标签页、主屏应用还是两者都有,是否为全新状态,首次启动还是再次启动。
- 测试流程与测试套件,即测试编号、公开的步骤、测试套件版本,以及运行中加载的每个文件的 SHA-256 哈希值。
- 操作这一步之前就写下的预期结果和出处。
- 原始数据,即仪器读数文件、截图和录屏,每一项都列出哈希值。
- 判定结果(符合预期、不符、无法定论、无法运行)和置信标签。
iOS 18.6.2 那次研究做在这些要求成文之前,没有全部做到。研究报告和论文都写明了缺了什么。原始读数从实验记录 N15 起才带记录工具哈希值的附属文件。运行时的哈希快照只覆盖一部分测试套件文件。环境记录里没有功能标志、VPN 和 iCloud 专用代理的状态,没写装的是哪个 Safari 网页扩展,也没记系统设置里的语言与地区。
真机实测内部的置信标签
链接到“真机实测内部的置信标签”一节| 标签 | 含义 | 能否作为真机实测发布 |
|---|---|---|
| A,仪器读数 | 一段公开的探针脚本的输出,经调试协议(例如 WebKit 远程检查器)从页面读出,原样存成 JSON。数值就是探针自己的输出,不掺模型的解读。 | 能 |
| S,截图或录屏 | 事后分析的截取画面,看像素值、视频帧和截取时间。 | 能 |
| O,观察者口述 | 只有操作员的口头报告。 | 不能。留在实验记录里,可以佐证 A 或 S 结果,不能单独成立。 |
标签可以组合。“A+S”指仪器读数和截取画面一致;“S+O”指有截取画面,另有操作员的口述交代背景。发布结果时,要写明其中最弱的那个必要组成部分。
实测结果与支持行的关系
链接到“实测结果与支持行的关系”一节行为结果挂到和它相关的支持行上,标明三种关系中的一种。
| 关系 | 什么情况 | 例子 |
|---|---|---|
| 与来源一致 | 实测和这一行相符。 | 调用 setAppBadge(3) 后主屏图标出现了角标,BCD 也记载支持 Badging API。 |
| 补充条件 | 这一行在来源没写的某个条件下成立。 | 在 iOS 18.6.2 上,Safari 标签页里也有 window.pushManager;worker 作用域是子路径时,它取不到那个 worker 的订阅。 |
| 与来源不符 | 实测和来源矛盾。 | notificationclick 在主屏应用里触发了,BCD 却记为不支持(见实例)。 |
支持行原有的来源、状态、版本和置信度都不动。按这套框架,关系和条件要显示在这一行里,注明日期,链接到对应的运行。“与来源不符”必须直接显示在行内,光放脚注不够,同时它也是向上游报告(BCD issue、WebKit bug)的候选。后一次运行和前一次结果不同时,两次结果都保留在页面上,各自注明版本号。1.0 版里,实测从不改变支持行的状态(原则 P8)。
十二条原则
链接到“十二条原则”一节P1. 每条结论都有层级和证据类别。 两样都用文字标出来,读者不必靠颜色分辨。
P2. 证据类别不能靠措辞升级。 “测过”“真机验证”“实际上”和对应的英文说法,只留给已发布的真机实测运行。
P3. 行为按系统版本号与场景分别记录。 行为结论写明设备、系统版本与版本号、场景和日期,不同版本号各占一行。
P4. 实测要注明日期、可复现,并附原始数据。 测试流程、测试套件版本与文件哈希值、环境信息、原始读数和截取画面,全部脱敏后公开。
P5. 预期在操作之前写下。 先记下预期结果和出处,再动手。结果和预期不符,本身就是一项发现。
P6. 记录优先于口述。 操作员的口述和读数或截取画面对不上时,以记录为准,冲突记为异常。只有口述撑着的结果,从不作为真机实测发布。
P7. 更正只追加,不改写。 条目写错了,就另写一条带日期的新条目来更正,并引用旧条目。撤回的读数标上“请勿引用”,放在原来那项结果旁边。
P8. 第 3 层为第 1 层补充条件,但不悄悄覆盖它。 1.0 版里,实测从不改变支持行的状态、版本或置信度。以后如果要定一条允许这样做的规则,得先作为本框架新的主版本公布,然后才能用。
P9. 写明范围。 每项结果都要交代样本量(设备数、版本数、运行次数)、哪些没测、已知有哪些效度威胁。
P10. 核查新颖性,标明复现。 结果印证了已公开的描述,就标为复现,并引用那份描述。找不到任何既有描述的结果才叫新发现,而且要说明怎么检索的。
P11. 观察者流程保护记录。 一个人操作设备、仪器在旁读取时,下面这些流程规则就是方法本身。用一个术语之前先定义它。每条消息只问一个问题。先确认这一步做完了,再问结果。仪器读取时,让屏幕保持 20 到 30 秒不动。不要用浏览器自动化写测试标记。iOS 18.6.2 那次研究里,safaridriver 开的自动化窗口有自己一份网站数据,和机主的 Safari 资料不相通(实验记录 N06)。
P12. 可比运行之间冻结测试套件字节与已安装应用。 某个测试套件版本只要有运行用过,就不再移动、重定向或修改。唯一的例外是修复隐私或安全缺陷,这时要发一份带日期的勘误,附上新旧哈希值。新版本用互不重叠的新作用域。为前后对照研究装的测试应用,在“之后”那次运行做完以前,作用域和起始网址都不改。
实例:iOS 上的 notificationclick
链接到“实例:iOS 上的 notificationclick”一节iOS 上 Service Worker 的 notificationclick 事件同时落在三层里,每一层给出的说法都不一样。
支持:BCD 的文档记载
链接到“支持:BCD 的文档记载”一节BCD 把 api.ServiceWorkerGlobalScope.notificationclick_event 在 iOS Safari 上记为 version_added: false(ServiceWorkerGlobalScope.json,github.com)。BCD 更新数据时借助 mdn-bcd-collector(github.com),这个网页服务把自动生成的功能检测做成页面,放进浏览器里跑。一位 BCD 贡献者在后面提到的 issue 里说,采集器检查的是 'onnotificationclick' in self。在 iOS 18.6.2 上,由 Safari 标签页控制的 worker 里这项检查是 false,和“不支持”采自标签页场景的推测对得上。这一行究竟出自哪一次采集,这次研究没有查明。2024 年 4 月有人在 BCD 提了 issue(github.com),说这个事件其实会触发。openpwa.net 上这一行仍按 BCD 的记载显示。
能力:推送演示
链接到“能力:推送演示”一节演示应用的推送权限页会请求通知权限,把你的浏览器订阅到推送,这是点按任何通知之前要走的步骤。你可以在自己的设备上试。这个页面本身不弹通知,也不触发 notificationclick,所以它演示的是推送能力,点击事件在你手机上怎样,它说明不了。
行为:主屏应用中的真机实测
链接到“行为:主屏应用中的真机实测”一节2026-10-20,在一台 iPhone 16 Pro、iOS 18.6.2(版本号 22G100)上,对添加到主屏幕的 Web 应用点按通知六次,notificationclick 六次都触发了。addEventListener 和 onnotificationclick 属性两种注册方式都有效,对已有窗口调用 focus() 也成功了(置信标签 A)。在主屏应用控制的 worker 里,'onnotificationclick' in self 为 true。每次点按时都有存活的窗口。WebKit bug 268797(bugs.webkit.org)第 35 条评论说,没有存活页面时点按不会触发,这种情形没有测。它和 BCD 那一行的关系是与来源不符。按这套框架,这一关系连同条件和运行日期显示在那一行里,那一行的状态不变(P8)。结果和原始数据见行为参考页主屏应用中的 notificationclick,另见研究的数据包。
如何引用
链接到“如何引用”一节你读的是哪个版本,就引用哪个版本。1.0 版的英文引用格式如下。
OpenPWA Editorial Team. The OpenPWA Evidence Layers: support, capability and behaviour as separate claims about web platform features. Version 1.0, 2026-10-20. openpwa.net. https://openpwa.net/about/evidence/v1.0/
中文可以这样写。
OpenPWA 编辑团队.《OpenPWA 证据分层:把 Web 平台特性的“支持”“能力”“行为”当作三类不同的结论》. 版本 1.0, 2026-10-20. https://openpwa.net/zh/about/evidence/v1.0/
正文里简称“OpenPWA 证据分层 v1.0”即可。要引用某一条定义,就在网址后加片段标识,例如 #p8 或 #decision-procedure。每个版本的页面、中英文两种语言,片段标识都一样。
框架文字采用知识共享署名 4.0 国际许可协议(creativecommons.org)。你可以按协议条款复制、翻译、改编或扩展,商业用途也可以;条款要求署名、附上协议链接,并说明是否作了修改。只是拿这套框架当方法用,不需要任何许可。网站或数据集要采用它,就给每条结论标上层级和证据类别,公布自己对“真机实测”的要求,并写明依据的是哪个版本。OpenPWA 的标签、数据模型和测试套件,不必照搬。
设备操作由 OpenPWA 的一名操作员在 iPhone 16 Pro 上完成。AI 代理会话通过 USB 读取页面状态、记录实验笔记并起草本文;自动门禁和 AI 事实核查做了检查。没有人逐篇审阅。