跳转到内容

OpenPWA 证据分层 1.0 版

发布于

这是 OpenPWA 证据分层(支持 / 能力 / 行为)的固定文本。版本 1.0,2026-10-20。 按照本框架的版本规则,固定版本页不会被改写;日后发现的事实错误以注明日期的勘误框标在页面顶部,下方正文保持发布时的原样。最新版本见 /zh/about/evidence/,版本历史列出了每一个版本。完整论文另含已有工作、参考文献和命名附录。

完整论文的 Markdown 下载:openpwa-evidence-layers-v1.0.zh.md(中文),SHA-256 30f24ea0659c5e19a5d7c8dad8b62ca517ee6cf036f5f7af49df4b0fd6270981;openpwa-evidence-layers-v1.0.md(英文),SHA-256 f23b1e63109bae469707e0a6c98dc3ab4e26a80e04e76d258437d89d03869c2f。

「OpenPWA 证据分层」把关于 Web 平台特性的结论分成三类。支持说的是浏览器有没有提供这个特性、从哪个版本开始提供。能力说的是这个特性能做什么,由一个你可以直接运行的演示来展示。行为说的是它在指定设备、系统版本和启动场景下实际怎样表现,由 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,在有人实测之前,这就是一条文档记载类的行为结论。

按顺序判断,第一个回答「是」的步骤决定归属。

  1. 这条结论是否说明特性被使用时会发生什么,或者其结果怎样随设备、系统版本、启动场景或状态而变(取值、优先级、默认值、时机、生命周期、渲染、提示框)?**是:第 3 层,行为。**再判断:是 OpenPWA 按测试流程运行得出的(真机实测),还是来源陈述的(文档记载)?
  2. 是否说明特性能完成某项任务,并指向一个可运行页面,但没有记录在案的运行?是:第 2 层,能力,演示可见。
  3. 是否说明特性是否可用、在哪里可用、从何时起可用(存在性、版本、标志位、部分支持、来源写明的可用条件)?是:第 1 层,支持,文档记载。如果这条结论来自 OpenPWA 的运行而不是来源,回到第 1 步:它是挂在该行上的一条行为记录。
  4. 都不是:它不是平台结论(建议、历史、观点),按其性质标注,或者删除。

混合陈述(「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 订阅了推送的主屏应用里,window.pushManager.getSubscription() 返回 null。
  • 与来源不符:实测与来源相矛盾。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 上 Service Worker 的 notificationclick 事件,每一层说的都不一样,每个标签也都说明了背后是什么证据。

BCD 把 api.ServiceWorkerGlobalScope.notificationclick_event 在 iOS Safari 上记为 version_added: false(ServiceWorkerGlobalScope.json,github.com)。BCD 的更新借助 mdn-bcd-collector(github.com)这一网页服务完成,它把自动生成的功能检测作为页面加载到浏览器里运行。下文那条 issue 中,一位 BCD 贡献者说明采集器检查的是 '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 事实核查做了检查。没有人逐篇审阅。