OpenPWA 证据分层 1.0 版立场文件
发布于
OpenPWA 证据分层:把 Web 平台特性的「支持」「能力」「行为」当作三类不同的结论。 版本 1.0,2026-10-20 · OpenPWA 编辑团队 · 许可:CC BY 4.0。
这是 OpenPWA 证据分层背后的完整立场文件,随 1.0 版固定。精简的定义页带有可供引用的固定片段标识,见 /zh/about/evidence/v1.0/。英文原版见 openpwa.net/about/evidence/v1.0/paper/。Markdown 下载:openpwa-evidence-layers-v1.0.zh.md,SHA-256 30f24ea0659c5e19a5d7c8dad8b62ca517ee6cf036f5f7af49df4b0fd6270981。
状态:立场文件,未经同行评审。由 AI 代理会话依据团队自己的研究材料为 OpenPWA 编辑团队起草,与 openpwa.net 其他内容一样,没有逐篇的人工签字放行。文中的实例分析建立在 OpenPWA 操作员于真实 iPhone 上完成的设备操作之上。本文是英文版 v1.0 的中文版,内容与英文版一致;如有出入,以英文版为准。
兼容表很擅长回答一个问题:某个特性在某个浏览器里支不支持,从哪个版本开始支持。开发可安装 Web 应用的人还需要另外两个答案,而支持表本来就不是为它们设计的:这个特性到底能做什么(给我看看),以及它在真机上、在特定系统版本和启动场景下、两项设置冲突或某个默认值生效时,实际会怎样表现。我们提出「OpenPWA 证据分层」(OpenPWA Evidence Layers),把这三件事当作三层结论:支持、能力、行为。每一层都有自己的原生证据类别(文档记载、演示可见、真机实测),每条公开发布的结论都同时标明所属层级和实际支撑它的证据类别。行为类结论按系统版本号与场景分别记录,注明日期,可以依据公开的测试流程与测试套件复现,并附带带哈希值的原始数据。行为层的结果以带日期的条件回填到支持层的对应行上(一致、补充条件、不符),而不是悄悄改写上游来源。这些要素单独看都不新:兼容数据早有注释和「部分支持」,一致性测试套件早在跑测试,演示站早在展示能力,从业者也早在发布设备笔记。本框架所做的,是把它们正式化并加以命名:按层分开,逐条结论标注证据类别;把已安装应用与设备场景下的行为当作独立的一层,配上自己的证据类别;用带日期的设备条件回填支持数据;以及跨系统升级的同机前后对照研究。本文给出各层定义和判定结论归属的步骤,提出十二条原则,并逐条套用到一项 iOS 18.6.2 主屏 Web 应用的单机研究上。
1. 问题所在:「支持吗?」并不是开发者最终要问的问题
链接到“1. 问题所在:「支持吗?」并不是开发者最终要问的问题”一节支持表把一个特性压缩进一个格子:支持、不支持、部分支持、一个版本号,有时再加一条注释。这种压缩是支持表的长处,也正是一个「支持」或「不支持」会误导把 Web 应用部署到手机上的人的原因。2026-10-20 OpenPWA 在一台运行 iOS 18.6.2(版本号 22G100)的 iPhone 16 Pro 上做的研究,给出了五个具体例子。实验记录条目记作 N01 到 N66 [S1]。
写着「不支持」,事件却触发了。 MDN browser-compat-data(BCD)把 api.ServiceWorkerGlobalScope.notificationclick_event 在 iOS Safari 上记为 version_added: false [R1]。2024 年 4 月有人在 BCD 提了 issue,报告这个事件其实会触发 [R2]。在 18.6.2 上,对已添加到主屏幕的 Web 应用,notificationclick 在六次点按中六次触发,addEventListener 和 onnotificationclick 属性两种注册方式都生效,对已有窗口调用 focus() 也成功了(N35 到 N40)。每次点按时都有一个存活的窗口;WebKit bug 268797 第 35 条评论报告「没有存活页面」时点按不触发,这种情形没有测试 [R9]。一位 BCD 贡献者说采集器做的是属性检查 'onnotificationclick' in self [R2],这项检查在主屏应用控制的 worker 里为 true,在 Safari 标签页控制的同一个 worker 里为 false(N03、N18、N34)。一种解释是采集器在标签页场景里读取了这项检查,但这次研究没有证实这一点。支持表的格子给整个 iOS Safari 只记一个值,没有注释区分这两种场景。
两个「支持」撞在了一起。 BCD 把 <meta name="theme-color"> 和 manifest 的 theme_color 成员都列为 iOS Safari 15 起支持 [R3, R4]。两条记录都没有说,页面设一种颜色、manifest 设另一种颜色时会怎样。在 18.6.2 上,主屏应用的状态栏条采用页面的 theme-color meta,覆盖 manifest 中不同的 theme_color,在已经安装的应用里也是如此;只有页面没有这个 meta 时才用 manifest 的值(三个专门构建的应用,N64 到 N65-a)。优先级是行为的属性,不是支持的属性。
一次只在某个时刻发生的复制。 WebKit 在 Safari 17.2 的说明中写道,Web 应用添加到主屏幕时,Cookie 会从 Safari 复制过去 [R5]。在 18.6.2 上,在 Safari 中设置的第一方 Cookie 在新添加的应用里出现了一次,此后两边各自独立;localStorage 和 IndexedDB 则两个方向都从未复制(N13、N16 到 N22)。支持表可以写「存储分区:支持」;光凭一个支持值,说不出「某一种存储在某一个时刻被复制一次,其他存储不复制」。
随系统版本变化的默认行为。 一个没有 manifest、也没有图标的页面,在 18.6.2 上添加到主屏幕后,是在 Safari 里打开的:用的是 Safari 的进程、存储和 Service Worker,navigator.standalone 为 false,display-mode: browser(N23、N63)。WebKit 的 Safari 26.0 说明写道,从 iOS 26 起,任何添加到主屏幕的网站默认都以 Web 应用方式打开 [R6]。因此,同一个页面、同一次点按,在不同系统版本上有文档记载的不同表现;我们在 iOS 26 及以后版本上的实测还没有做。支持表里「manifest」那一行的版本号体现不了这一点,带日期、带版本号的观测记录可以。
没人列表记录的生命周期。 用户在多任务界面把应用划掉之后,上一次启动的文档大约六秒后仍然存活,clients.matchAll() 能找到它;在更早的一步中,Web 应用的进程号在划掉后也没有变(N16、N38、N40)。这是一种保证、一次竞态,还是调试连接造成的假象,需要更多次运行才能回答。通知处理函数该调用 focus() 还是 openWindow(),取决于的正是这类事实,而我们读过的兼容性来源都没有记录它。
五个例子的共同点是:支持层对它自己所说的内容大体是对的,风险来自把它当作关于行为的结论来读。办法不是做一张更大的表,而是把两类结论分开,各自标明背后的证据,再把它们明确地连接起来。
2. 三个层级
链接到“2. 三个层级”一节结论指关于某个 Web 平台特性、读者可以据以行动的一条陈述。每条结论只属于一个层级,由它回答的问题决定;每条结论带一个证据类别,由实际支撑它的东西决定(第 3 节)。
| 第 1 层:支持 | 第 2 层:能力 | 第 3 层:行为 | |
|---|---|---|---|
| 问题 | 支持吗?从哪个版本开始? | 能做什么?给我看看。 | 在这台设备、这个系统版本、这个场景下,究竟会发生什么? |
| 典型写法 | 「iOS 16.4 起,Safari 在主屏 Web 应用中支持 Push API。」 | 「本页会请求通知权限并显示一条通知。去试试。」 | 「在 iOS 18.6.2(22G100)上,主屏应用的状态栏条优先采用页面的 theme-color meta,而不是 manifest 的 theme_color。」 |
| 允许的证据类别 | 文档记载 | 演示可见 | 真机实测(原生)或文档记载 |
| 原生来源 | 规范、厂商文档与发布说明、BCD | 实际调用该特性的可运行演示 | 在指定设备上按公开流程完成、带日期的一次运行 |
| 单位 | 特性 × 浏览器 × 版本范围 | 特性 × 演示 | 行为 × 设备 × 系统版本号 × 场景 × 日期 |
2.1 第 1 层:支持
链接到“2.1 第 1 层:支持”一节指来源所陈述的、某个特性在指定浏览器和版本范围内存在、不存在、部分存在、处于标志位之后或已被移除的结论。来源自己写明的可用条件(「仅限主屏 Web 应用」「需要用户激活」)属于第 1 层结论的一部分,因为它们限定了「支持」的适用范围。第 1 层按定义就是文档记载:OpenPWA 不自己撰写支持声明,只转述并交叉核对。当 OpenPWA 的某次实测与某条支持声明相关时,实测结果仍是一条第 3 层记录,以「关系」的形式挂到支持行上(第 4 节)。
2.2 第 2 层:能力
链接到“2.2 第 2 层:能力”一节指某个特性能够完成某项任务、并有一个尝试完成它的可运行页面作为支撑的结论,例如请求权限、设置角标、分享文件、接收推送。这类结论讲的是可能性。演示在某台设备上的表现,属于运行它的那个人的观察。OpenPWA 按测试流程记录下来的演示运行,产生的是第 3 层记录,而不是更强的第 2 层结论。
2.3 第 3 层:行为
链接到“2.3 第 3 层:行为”一节指特性在给定条件下实际怎样表现的结论:
- 优先级:输入相互冲突时谁生效(页面 meta 优先于 manifest);
- 默认值:缺少某项输入时怎样处理(没有图标时显示字母图块);
- 场景差异:主屏应用与 Safari 标签页;由应用控制的 worker 与由标签页控制的 worker;
- 时机与生命周期:添加时复制 Cookie;划掉后页面仍存活;权限 Promise 一直挂起到用户作答;
- 几何与渲染:视口 402 × 812,顶部安全区 62 px,状态栏条
#161616; - 陷阱:作用域为子路径的 worker 的推送订阅,不会由
window.pushManager返回。
实测类的第 3 层结论一定写明设备、系统版本与版本号、场景和日期;文档记载类的第 3 层结论带有其来源写明的条件,往往只有一个版本号。OpenPWA 自己运行过的,类别是真机实测;由来源描述的,类别是文档记载(WebKit 在 Safari 17.2 中对 Cookie 复制的描述,在有人实测之前,就是一条文档记载类的第 3 层结论)。
2.4 边界情形
链接到“2.4 边界情形”一节- 功能检测。 像
'onnotificationclick' in self这样的存在性检查,如果由来源在不区分场景的情况下报告,属于第 1 层。同样的检查由 OpenPWA 在写明的场景中运行,就是一条第 3 层记录;本例中它的结果恰恰取决于场景(应用的 worker 中为 true,标签页的 worker 中为 false),而这正是支持行所缺少的信息。 - 由运行得出的版本号(「在 18.6.2 上可用」)是关于一个版本号的第 3 层结论。它不能确定
version_added,后者需要来源,或在更早的版本上实际运行。 - 限额与性能(配额大小、时间预算):厂商公布的限额属于第 1 层,实测得出的属于第 3 层。
- 在读者设备上运行失败的演示是读者自己的观察,只有按测试流程复现之后才成为 OpenPWA 的结论。
- 混合陈述(「16.4 起支持,并且只在主屏应用中触发」)拆成每层一条结论。
2.5 判定步骤
链接到“2.5 判定步骤”一节按顺序判断,第一个回答「是」的步骤决定归属。
- 这条结论是否说明特性被使用时会发生什么,或者其结果怎样随设备、系统版本、启动场景或状态而变:取值、优先级、默认值、时机、生命周期、渲染、提示框?**是:第 3 层。**再判断:是 OpenPWA 按测试流程运行得出的(真机实测),还是来源陈述的(文档记载)?
- 是否说明特性能完成某项任务,并指向一个可运行页面,但没有记录在案的运行?是:第 2 层,演示可见。
- 是否说明特性是否可用、在哪里可用、从何时起可用(存在性、版本、标志位、部分支持、来源写明的可用条件)?是:第 1 层,文档记载。如果这条结论来自 OpenPWA 的运行而不是来源,回到第 1 步:它是挂在该行上的一条第 3 层记录。
- 都不是:它不是平台结论(建议、历史、观点),按其性质标注,或者删除。
3. 证据类别与分级
链接到“3. 证据类别与分级”一节本节说明哪些东西可以支撑一条结论,以及实测结果怎样分级。
3.1 三种证据类别
链接到“3.1 三种证据类别”一节文档记载。 由 OpenPWA 之外的来源陈述:规范、厂商文档、发布说明、厂商工程博客、厂商 bug 跟踪系统或 BCD。展示时附来源和核对日期。BCD 的数据即便来自自动采集,在本框架中也算文档记载,因为 OpenPWA 并没有亲自观测。第三方笔记(从业者博客、论坛)也算文档记载,按本站已有的高、中、低置信度规则给出较低置信度 [S2]。文档记载类的第 3 层结论展示为 由<来源>记载,OpenPWA 未实测,避免被当作实测结果来读。
演示可见。 有一个可运行的 OpenPWA 演示在调用这项能力。展示时附演示链接,措辞邀请读者在自己的设备上试一试(「去试试」)。「演示可见」只表示演示存在、并且设计用来调用该特性,从不表示该特性在任何一台具体设备上可用。
真机实测。 OpenPWA 在一台指定的真实设备上按公开的测试流程运行并记录了结果。要算作真机实测,一次运行必须具备以下全部内容:
- 环境信息:设备市场名称与型号标识、系统版本与版本号、发布渠道、浏览器版本、语言与地区、非默认的功能标志、内容拦截器或 VPN 状态,以及使用的检查主机(如有)。
- 日期与时间,含时区,整次运行和每次读取都要有。
- 场景:标签页、主屏应用或两者;是否为全新状态;首次启动还是再次启动。
- 测试流程与测试套件:测试编号、公开步骤,以及测试套件版本和运行中加载的每个文件的 SHA-256 哈希值。
- 事先写下的预期:预期结果及其来源,在操作该步骤之前记录(写在检查清单或实验记录里,而非公开的预注册平台)。
- 原始数据:仪器读数文件、截图与录屏,逐个列出哈希值。
- 结论判定:符合预期、不符、无法定论或无法运行。
- 置信标签(3.2)。
以上是 v1.0 的要求。18.6.2 研究在这些要求写成之前就已完成,没有全部满足。它的缺口如下 [S1]:原始读数从 N15 起才带有记录工具哈希值的附属文件;测试套件在运行时的快照只覆盖 lab.js、sw.js 和 T7 的文件,没有覆盖每个页面,其余文件只能以部署版本中的仓库版本来标识;环境记录里缺少功能标志、VPN 与 iCloud 专用代理的状态、已安装的 Safari 网页扩展是哪一个,以及系统设置中的语言与地区。
3.2 真机实测内部的置信标签
链接到“3.2 真机实测内部的置信标签”一节| 标签 | 含义 | 能否作为真机实测发布 |
|---|---|---|
| A,仪器读数(agent-measured) | 对页面状态的仪器读取:一段公开的探针脚本的输出,经调试协议(例如 WebKit 远程检查器协议)取得,原样存为 JSON。「代理」指运行探针的一方;数值是探针的输出,不是模型的解读 | 能 |
| S,截图或录屏 | 事后分析的截取画面(像素值、视频帧、截取时间) | 能 |
| O,观察者口述 | 只有操作员的口头报告 | 不能。保留在实验记录中,可以佐证 A 或 S 结果,不能单独成立 |
标签可以组合:「A+S」表示仪器读数与截取画面一致;「S+O」表示截取画面加上操作员的口述作背景。结果发布时写明其中最弱的必要组成部分。例如 18.6.2 的状态栏颜色来源记为 S+O:像素证据是 S,而当时屏幕上是哪一个应用,部分依赖操作员的口述。
3.3 日期与可复现性
链接到“3.3 日期与可复现性”一节一条实测结论只对一个版本号、一台设备、一个日期成立,不得通过措辞推广到其他版本(「iOS 18 会这样」)。如果另一个人在同类设备、同一系统版本号上,能按测试流程操作,加载同样的测试套件字节(以哈希值核对),并与原始数据比对,这条结论就是可复现的。系统升级后的同机复测是同条件对比:同样的硬件、同样的已安装应用、同样的测试套件文件,以升级作为干预。
复现有一个限制:研究报告写明,测试用的手机升级到 iOS 27 之后,它在 iOS 18.6.2 上的结果只能在另一台仍停留在该版本的设备上重测。这就是原始数据比文字更重要的原因。没人能再跑一遍时,公开的读数、截取画面和哈希值是审查它的唯一途径。
4. 各层之间的关系
链接到“4. 各层之间的关系”一节各层保持分开,通过明确的关系相互连接。
4.1 第 3 层为第 1 层补充条件
链接到“4.1 第 3 层为第 1 层补充条件”一节行为结果挂到与之相关的支持行上,带三种关系之一:
- 一致:实测与该行相符(调用
setAppBadge(3)后主屏图标显示角标;BCD 记载支持 Badging)。 - 补充条件:该行在来源未写明的某个条件下成立(声明式 Web 推送:Safari 标签页中也存在
window.pushManager;在两个已用子路径作用域 worker 订阅了推送的主屏应用里,window.pushManager.getSubscription()返回 null)。 - 不符:实测与来源相矛盾(
notificationclick在主屏应用中触发,而 BCD 记为不支持)。
支持行保留原有的来源、状态、版本与置信度。关系和条件显示在该行中,注明日期,并链接到对应运行。本框架所说的「回填」就是这个意思:支持数据获得带日期的设备条件,但不被它们改写。
4.2 冲突的处理与展示
链接到“4.2 冲突的处理与展示”一节「不符」是一项发现,不是需要藏起来的错误。它在行内显示为 与<来源>不符,附条件和运行日期,同时进入差异清单,成为向上游报告(BCD issue、WebKit bug)的候选。只有当上游来源改变,或 OpenPWA 公布了允许实测决定状态的规则(v1.0 中没有,见 P8)时,该行的状态才会改变。后一次运行与前一次不同时,两者都保留可见,各自注明版本号;新的运行不会抹掉旧的。
4.3 第 2 层连接另外两层
链接到“4.3 第 2 层连接另外两层”一节演示是读者把一条支持结论变成自己亲手检查的地方,也常常是行为测试的起点,但它对两者都不构成定论。本框架把它单独放在一层,就是为了不让「我的手机上能跑」被误读成「OpenPWA 实测过」或「厂商支持」。
5. 原则
链接到“5. 原则”一节P1. 每条结论都有层级和证据类别。 读者能看到两者,并且是文字标注,不只靠颜色区分。
P2. 证据类别不能靠措辞升级。 「测过」「真机验证」「实际上」及其英文对应说法,只用于已发布的真机实测运行。
P3. 行为按系统版本号与场景分别记录。 行为结论写明设备、系统版本与版本号、场景和日期。不同版本号各占一行。
P4. 实测要注明日期、可复现,并附原始数据。 测试流程、测试套件版本与文件哈希值、环境信息、原始读数与截取画面,全部以脱敏形式公开。
P5. 预期在操作之前写下。 先记录预期结果及其来源。「与预期不符」是一项发现。
P6. 记录优先于口述。 操作员的口述与读数或截取画面冲突时,以记录为准,冲突作为异常记入。只有口述的结果从不作为真机实测发布。
P7. 更正只追加,不改写。 错误的条目由一条新的、带日期并引用旧条目的条目来更正。被撤回的读数列为「请勿引用」,放在它被撤回的那项结果旁边。
P8. 第 3 层为第 1 层补充条件,但不悄悄覆盖它。 在 v1.0 中,实测从不改变支持行的状态、版本或置信度。将来若有允许这样做的规则,先作为本框架的新版本公布,再付诸使用。
P9. 写明范围。 样本量(设备数、版本数、运行次数)、哪些没有测试、已知的效度威胁,都是每项结果的组成部分。
P10. 核查新颖性,标明复现。 证实已有公开描述的结果标为复现,并引用该描述。只有找不到既有描述的结果才称为新发现,并说明检索过程。
P11. 观察者流程保护记录。 由人操作设备、由仪器读取时,流程规则本身就是方法的一部分。先定义每个术语再使用(例如「状态栏」指显示时间和电量的那一条)。每条消息只问一个问题。先确认某一步已经做完,再问它的结果。仪器读取进行时,屏幕保持 20 到 30 秒不动。不要通过浏览器自动化写入测试标记:在 18.6.2 研究中,safaridriver 打开的自动化窗口有自己的网站数据,和机主的 Safari 资料是分开的,写在那里的标记不会出现在测试要找的地方(N06)。
P12. 可比运行之间冻结测试套件字节与已安装应用。 测试套件的某个版本一旦被某次运行使用,就不再移动、重定向或修改;唯一例外是修复隐私或安全缺陷,并以附新旧哈希值的带日期勘误公布。新版本使用互不重叠的新作用域。为前后对照研究安装的测试应用,在「之后」的那次运行完成前,保持作用域和起始网址不变。
6. 在 openpwa.net 上的应用
链接到“6. 在 openpwa.net 上的应用”一节本框架正在被做进本站的证据结构。定义页及其固定版本页和变更历史、真机实验室及其行为参考页,以及研究和它的数据包 [S1],随 v1.0 一同发布。兼容表上的标记和参考页上的证据栏还在计划中,每一项上线时都会写进站点变更记录。
- 定义页。
/zh/about/evidence/(英文/about/evidence/)以站点文风发布本框架,并提供固定版本页和变更历史。 - 兼容表(计划中)。 矩阵的形状不变。带实测证据的行将显示「真机实测」标记和带编号、带日期的脚注,脚注写明关系(「2026-10-20 在 iPhone 16 Pro、iOS 18.6.2(22G100)上实测:在主屏应用中经两种注册方式均会触发。与 BCD 不符。」)。表格标题处将有图例,列出三个层级及其证据类别。
- 参考页(计划中)。 在可用性横幅下方加一条证据栏:文档记载(来源与最后核验日期)· 演示可见(演示链接)· 真机实测(最近一次运行)。每一项只在存在时显示。
- 行为参考页。 每个行为主题一页(
/zh/lab/behaviour/<主题>/),包含问题、操作步骤、按版本号列出并带锚点的结果、文档怎么说、数据、它支撑了哪些页面,以及局限。 - 真机实验室。 产出第 3 层的公开栏目:测试流程索引、操作指南、测试套件版本与哈希值、测试路线图、方法与效度威胁,以及各项研究。
- 研究。 带数据包、注明日期的论文,例如 iOS 18.6.2 研究 [S1],每篇都说明其结论属于哪一层。
7. 实例:逐条拆解 iOS 18.6.2 研究
链接到“7. 实例:逐条拆解 iOS 18.6.2 研究”一节研究:OpenPWA device test, 2026-10-20, iPhone 16 Pro, iOS 18.6.2 (22G100) [S1]。除特别标明外,每一行都是第 3 层结论。「L1 关系」指该结果挂到对应支持行上时会带的关系。「既有描述」说明此前是否已有公开描述(P10)。
| # | 结论(18.6.2,除注明外均为主屏应用) | 层级 | 类别与标签 | 实验记录 | L1 关系 | 既有描述 |
|---|---|---|---|---|---|---|
| 1 | 没有 manifest、没有图标的页面添加到主屏后在 Safari 中打开,使用 Safari 的存储和 worker;display-mode: browser |
3 | 真机实测,A+S | N23、N63 | 补充条件(iOS 26 之前,独立启动需要 apple-mobile-web-app-capable meta 标签或 manifest 的 display 值) |
文档记载(WebKit 16.4 [R38];变化见 WebKit 26.0 [R6]) |
| 2 | 有 manifest 的应用以 standalone 方式打开,视口 402 × 812;只有 display-mode: standalone 匹配 |
3 | 真机实测,A+S | N13 | 一致(display standalone) |
文档记载(复现,补充了数值) |
| 3 | 图标优先级:180 px 的 apple-touch-icon 优先于 manifest 图标;没有它时用 manifest 的 any 192;都没有时显示字母图块 |
3 | 真机实测,S | N11、N63 | 补充条件(manifest icons) |
文档记载(firt.dev [R8]) |
| 4 | localStorage 和 IndexedDB 在 Safari 与应用之间从不复制,两个方向都不 | 3 | 真机实测,A | N13、N16 到 N20 | 补充条件(存储分区) | 文档记载(WebKit 17.2) |
| 5 | 第一方 Cookie 复制进新应用一次,此后独立;每个应用有自己的 Cookie 存储 | 3 | 真机实测,A(复制时机:中等把握) | N18 到 N22 | 补充条件 | 复现 WebKit 17.2 [R5] |
| 6 | notificationclick 经两种注册方式触发,六次点按六次触发,每次都有存活窗口;focus() 成功。无窗口情形未测 |
3 | 真机实测,A | N35 到 N40 | 不符(BCD version_added: false) |
BCD issue #22959 中有开发者报告 [R2];复现并补充细节 |
| 7 | 'onnotificationclick' in self 在应用控制的 worker 中为 true,在标签页控制的 worker 中为 false |
3 | 真机实测,A | N03、N18、N34 | 补充条件;解释了采集器的结果 | 就我们所查,为新发现 |
| 8 | 点按后出现权限提示;requestPermission() 一直挂起到用户作答(2068 ms) |
3 | 真机实测,A+S | N53、N54、N58、N59 | 一致 | 文档记载 |
| 9 | 一次授权同时覆盖两个推送管理器;worker 作用域为子路径时,window.pushManager.getSubscription() 返回 null。根作用域 worker 未测 |
3 | 真机实测,A | N32、N33、N41 | 补充条件(声明式 Web 推送那一行) | 与 WebKit 声明式 Web 推送文章一致 [R7] |
| 9b | 普通 Safari 标签页中存在 window.pushManager,而 PushManager 和 Notification 不存在(仅暴露情况) |
3 | 真机实测,A | N03、N41 | 补充条件 | 就我们所查,为新发现 |
| 10 | 默认状态栏样式:视口从顶部下方 62 px 开始,状态栏条为纯色 #161616,无模糊;viewport-fit=cover 只增加 34 px 底部安全区 |
3 | 真机实测,A(几何)+ S(像素) | N25 到 N29、N62 | 补充条件 | 行为有文档记载;未找到公开的 18.x 数值 |
| 10c | 状态栏条颜色:页面 theme-color meta 优先于 manifest theme_color;manifest 作为后备 |
3 | 真机实测,S+O | N64 到 N65-a | 补充条件(两条主题色行) | 我们读过的来源都没写明优先级;不作为新发现 |
| 11 | black-translucent 加 viewport-fit=cover 使页面延伸到状态栏下方:视口 402 × 874,顶部安全区 62 px |
3 | 真机实测,A(外观另有 O) | N55 | 一致 | 文档记载 |
| 12 | setAppBadge(3) 在图标上显示「3」;清除角标只有操作员口述 |
3 | 真机实测,S(清除为 O,不发布) | N60 | 一致 | 文档记载 |
| 13 | 划掉应用后,上一个文档约 6 秒后仍存活,能被 clients.matchAll() 找到 |
3 | 真机实测,A | N16、N38、N40 | 无(没有对应支持行) | 未核查;需要更多运行才能下一般性结论 |
| 14 | 在此版本上不存在 BeforeInstallPromptEvent 和 navigator.install |
3 | 真机实测,A | 研究报告 §T9 | 一致(BCD:不支持) | 文档记载 |
| 15 | BCD:iOS Safari notificationclick_event 不支持 |
1 | 文档记载(BCD) | 不适用 | (该行来源) | 不适用 |
| 15b | WebKit:Web 应用添加时会复制 Cookie(Safari 17.2) | 3 | 文档记载(WebKit [R5]) | 不适用 | 不适用 | 不适用 |
| 16 | /demo/push/ 上的推送权限演示 |
2 | 演示可见 | 不适用 | 不适用 | 不适用 |
| X1 | 「状态栏是蓝色的/跟随页面顶部颜色」 | 不适用 | 已撤回(N46) | N46 | 请勿引用 | 不适用 |
| X2 | 「theme-color 对状态栏没有作用」以及「应用使用 manifest 的 theme_color」 |
不适用 | 已被推翻(N65、N65-a) | N65 | 请勿引用 | 不适用 |
这张表说明了三件事。第一,这项研究的每个结果都是第 3 层记录,其中就我们所查只有两项是新发现(7 和 9b)。其余结果的价值在于:它们带日期,在指定版本号上实测,可以作为条件复用到支持行上。第二,撤回本身也是记录的一部分:状态栏颜色来源这个问题先后有过两次错误读数,直到三应用测试才定论;本框架把这些读数作为「请勿引用」保留下来,而不是删掉。第三,同一个特性可以同时出现在三层(第 6、15、16 行),同一种行为也可以既有文档记载又有真机实测(第 5 行和第 15b 行),各自按实际情况标注。
8. 研究议程
链接到“8. 研究议程”一节- 每个版本都实测。 每个 iOS 与 Safari 小版本发布后重跑核心测试,每个版本约一小时,每个行为新增一行带日期的结果。修复版本只重跑发布说明提到的相关测试。
- iOS 27 同机复测。 第二项研究:同一台 iPhone 从 18.6.2 升级,使用同样的已安装主屏应用和同样的 v1 测试套件字节。每个行为都得到一次跨越同一干预(升级)的前后对比(时间和其他设备状态也会变化,研究会尽量记录)。它能回答全新设备回答不了的问题:已有应用升级后是否保留存储、Cookie、权限和推送订阅;升级前添加的无 manifest 图标,启动默认方式是否改变;状态栏优先级是否依旧。
- 18.6.2 留下的缺口。 没有窗口时的
clients.openWindow()路径;Cookie 复制的时机(添加时还是首次启动时);清除角标(18.6.2 研究中只有 O);根作用域 worker 下的声明式 Web 推送,这需要一个单独的源。 - 其他平台。 Android Chrome 与 Samsung Internet(安装提示、
navigator.install、分享目标),桌面 Chromium(文件处理、启动处理),Mozilla 有文档说明安装入口的 Firefox 场景,iPadOS(多任务窗口、添加面板)。 - 独立复现。 提供一种结果格式,让其他人提交运行结果,标为社区结果,与操作员运行分开展示。
- 评估框架本身。 统计一年里有多少支持行获得「补充条件」或「不符」关系,以及后来的版本推翻早先实测的频率。如果这些关系始终很少,本框架就是额外负担;如果很常见,那么只看支持层,就会以同样的比例被误导。
9. 与已有工作的关系
链接到“9. 与已有工作的关系”一节本框架的每个要素在别处都已存在。以下来源于 2026-10-20 阅读;只能靠 JavaScript 渲染的页面,改为阅读其仓库或数据文件。
9.1 按领域梳理已有工作
链接到“9.1 按领域梳理已有工作”一节兼容数据。 caniuse 为每个浏览器版本给出一个取值(y、表示部分支持的 a、n、u、p、x、d),附编号注释和已知 bug;它的贡献指南把附上测试用例链接列为优质新特性 PR 的标准之一 [R10]。它的测试套件检查的是「basic support」,并提醒「test may pass but support is actually buggy」[R11]。BCD 的支持声明包含 version_added(一个版本、false、"preview" 或区间值 "≤")、flags、prefix、partial_implementation 和 notes [R12, R13]。BCD 还允许为「a contextual support condition that is not readily feature detectable」设立行为子特性,并且已经记录了已安装场景的差异:Screen Wake Lock 在 iOS Safari 上 从 16.4 起、到 18.4 之前为 partial_implementation,注释写着「Does not work in standalone Home Screen Web Apps」[R14]。BCD 的更新借助 mdn-bcd-collector 完成,它根据 Web IDL 与 CSS 定义生成功能检测,作为页面在浏览器里运行,也可以通过 Selenium 交给云端浏览器服务运行 [R15]。所以支持层已经带有场景信息,形式是挂在版本范围上的注释和子特性;它没有的是这些注释的测试日期、系统版本号、设备、原始数据和复测计划。
一致性测试与互操作测试。 web-platform-tests 与 wpt.fyi 在主流桌面浏览器上运行规范测试套件,Interop 每年为选定的重点领域打分;在 Interop 2026 中,移动端测试只是调查领域,不计分,Mozilla 的发布文章也指出,浏览器可能在得分很好的同时「having inconsistent behavior」[R16, R17]。这些描述都没有涉及主屏启动、状态栏、图标或权限提示。测试领域的文献划出了同一条线。ISO/IEC 9646 把一致性测试定义为依据标准的要求测试实现[R31];ETSI 把它与互操作测试区分开,并指出「items passing conformance testing may still not interoperate」[R32]。W3C QA Framework 说出了为什么需要第三类证据:规范中存在「discretionary items」,即留给用户代理自行决定的行为 [R33]。第 3 层在 iOS 上记录的内容(状态栏颜色、图标选择、Cookie 复制、启动默认方式)大多属于这一类。
支持情况汇总与发布跟踪。 Baseline(W3C WebDX 社区组的 web-features 项目)依据 BCD 把特性标为 Limited、Newly available 或 Widely available,并排除部分实现 [R18]。webstatus.dev 合并了 BCD、WPT 和 web-features [R19]。Chrome Platform Status 跟踪 Blink 的特性发布 [R20]。WebKit 的特性状态页已经停用;Safari 发布说明仍是厂商的正式记录,其中有「Home Screen Web Apps」小节 [R21]。在本框架中,它们都是第 1 层来源。
演示与从业者笔记。 whatpwacando.today 提供四十多个在线演示,并显示访问者设备支持哪些特性 [R22];它是最典型的第 2 层资源,不发布带日期的结果。Maximiliano Firtman 的 iOS PWA 笔记在内容上最接近第 3 层:它按特性区分已安装应用与 Safari 标签页,并记录诸如「apple-touch-icon overrides manifest icons」这样的优先级规则 [R8]。其证据是作者私下的测试,方法、设备和原始数据均未公开。
场景维度与带日期的真实客户端测试。 caniwebview(W3C WebView 社区组)把 WebView 作为一个兼容场景,数据来自 BCD 和手写的特殊情况说明 [R34]。Steiner(2018)比较了 PWA 特性在 WebView 与浏览器中的暴露情况[R28]。caniemail 是方法上最有力的先例:每个特性记录 last_test_date、test_url 和 test_results_url,支持情况按客户端和平台拆分,每一项以客户端版本(如 Apple Mail 12.4)或测试年月(如 Gmail 2019-02)为键 [R35]。它测试的是邮件客户端而不是浏览器;在我们读过的文件中,它不记录系统版本号或哈希值。
学术研究与大规模测量。 WebDiff、CrossCheck 和 X-PERT 检测桌面浏览器之间的渲染与行为差异 [R25, R27, R26],Mesbah 与 Prasad 的工作也是如此 [R24]。早期 PWA 论文评估了它作为跨平台开发方案的可行性 [R29, R30];Web Almanac 测量网站如何使用 PWA 特性 [R23];也有研究考察 Web 上的特性使用情况 [R39]。我们没有找到公开发布了数据的、关于 iOS 主屏 Web 应用行为的实证研究。按证据强度为结论分级在其他领域是常规做法,比如医学中的 GRADE [R36] 和软件工程系统综述中的证据强度评估 [R37];本框架借用了这一思路。
9.2 哪些是新的,哪些不是
链接到“9.2 哪些是新的,哪些不是”一节| 要素 | 最接近的已有工作 | 我们的判断 |
|---|---|---|
| 记录支持情况因场景而异(已安装应用与标签页、WebView 与浏览器) | BCD 注释与场景子特性 [R13, R14];caniuse 注释;caniwebview [R34];firt.dev [R8];Steiner [R28] | **已有。**不主张。 |
| (a) 把已安装应用与设备场景下的行为作为独立的一层,配有自己的证据类别,而不是挂在支持声明上的一条注释 | 同上,行为以注释、子特性或无法审查的表格形式出现 | **部分新。**内容早已存在;把它单独作为一层、配上自己的证据要求,就我们所查是新的。 |
| (b) 每条结论明确标注文档记载/演示可见/真机实测 | GRADE [R36];软件工程证据分级 [R37];caniuse 的 u 与测试链接 [R10] |
在 Web 兼容领域是新的,思路借自其他领域。 |
| (c) 以带日期、精确到系统版本号、带哈希值的设备结果,以关系(一致、补充条件、不符)回填支持行 | caniemail 带日期的测试 [R35];mdn-bcd-results 的采集器原始输出 [R15];BCD 链接到 bug 的注释 | **部分新。**带日期的真实客户端测试在 caniemail 中已有;精确到版本号、包含设备与安装场景、带哈希值的原始数据,以及浏览器支持表上的三种关系,在我们读过的来源中都没有出现。 |
| (d) 跨系统升级的同机前后对照研究 | 一般意义上的前后重复测量与回归测试;零散的论坛升级回归报告 | **部分新。**设计本身是教科书式的;没有找到公开、可复现的 Web 应用行为前后对照数据集。说法是「就我们所知首个公开发布」,不是新方法。 |
| 区分一致性与特定场景下的行为 | ISO/IEC 9646 [R31]、ETSI [R32]、W3C QA Framework 的 discretionary items [R33] | **已有。**本框架以此为基础。 |
总之,OpenPWA 把这个领域已经非正式使用的一种结构正式化并加以命名。贡献在于:这个结构是明确的,逐条结论分级,在系统版本号层面区分场景,并且可以依据公开数据审查。如果有更早的来源同时做到了这四点,欢迎告知,我们会在下一个版本中引用。
10. 如何采用与引用
链接到“10. 如何采用与引用”一节许可。 本文以知识共享署名 4.0 国际许可协议(CC BY 4.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)。
采用方式。 一个网站或数据集采用本框架,需要为每条结论标注层级和证据类别,公布它所采用的「真机实测」要求(至少包括 3.1 的要求),并写明所依据的版本。不必使用 OpenPWA 的标签、数据模型或测试套件。
版本规则。 主版本号变化表示增加、删除或重新定义某个层级、证据类别或原则;次版本号变化表示增加原则、边界情形或展示规则;修订号变化只修改措辞。每个已发布版本都保留固定网址(/about/evidence/v<主>.<次>/),变更历史只追加。
11. 术语表
链接到“11. 术语表”一节- 结论:关于某个 Web 平台特性、读者可以据以行动的一条陈述。
- 层级:结论回答的问题类型:支持(第 1 层)、能力(第 2 层)、行为(第 3 层)。
- 证据类别:支撑结论的依据:文档记载、演示可见、真机实测。
- 场景:行为结论的条件:设备、系统版本号、启动场景(标签页、主屏应用)、状态(全新、添加后、再次启动后、划掉后)。
- 运行:在一台设备、一个版本号上,于一个日期执行一次测试流程。
- 测试套件(harness):一次运行所加载的测试页面与应用的集合,有版本号和哈希值。
- 测试流程:一项测试公开的步骤、记录字段与环境信息。
- 置信标签:A(仪器读数)、S(截图或录屏)、O(观察者口述)。
- 关系:实测结果与支持行的关系:一致、补充条件、不符。
- 回填:把带日期的实测结果作为关系和条件挂到支持行上。
- 复现:证实已有公开描述的实测结果。
- 同机研究:在同一台实体设备上、跨一次系统升级、使用同样的已安装应用和测试套件字节所做的前后对比。
参考文献
链接到“参考文献”一节所有网址访问于 2026-10-20。编号与英文版一致;条目标题保留原文。「仓库阅读」表示该页面依赖 JavaScript 渲染,改为阅读其源数据。
研究与本站
- [S1] OpenPWA Editorial Team. “Home Screen web apps on iOS 18.6.2: an instrumented single-device study of display mode, storage, status bar and notification behaviour.” Version 1, 2026-10-20. 数据:https://openpwa.net/research/2026-10-ios18-home-screen-web-apps/data/。引用字符串:OpenPWA device test, 2026-10-20, iPhone 16 Pro, iOS 18.6.2 (22G100)。
- [S2] OpenPWA. 方法论。https://openpwa.net/zh/about/methodology/
厂商文档与兼容数据
- [R1] mdn/browser-compat-data.
api/ServiceWorkerGlobalScope.json,notificationclick_event. https://github.com/mdn/browser-compat-data/blob/main/api/ServiceWorkerGlobalScope.json - [R2] mdn/browser-compat-data issue #22959(2024-04-29 提交). https://github.com/mdn/browser-compat-data/issues/22959
- [R3] mdn/browser-compat-data.
html/elements/meta.json,name.theme-color. https://github.com/mdn/browser-compat-data/blob/main/html/elements/meta.json - [R4] mdn/browser-compat-data.
manifests/webapp/theme_color.json. https://github.com/mdn/browser-compat-data/blob/main/manifests/webapp/theme_color.json - [R5] WebKit. “WebKit Features in Safari 17.2.” 2023-12-11. https://webkit.org/blog/14787/webkit-features-in-safari-17-2/
- [R6] WebKit. “WebKit Features in Safari 26.0.” 2025-09-15. https://webkit.org/blog/17333/webkit-features-in-safari-26-0/
- [R7] WebKit. “Meet Declarative Web Push.” 2025-03-27. https://webkit.org/blog/16535/meet-declarative-web-push/
- [R8] M. Firtman. “iOS PWA Compatibility.” firt.dev,2026-10-13 更新。https://firt.dev/notes/pwa-ios/
- [R9] WebKit Bugzilla. Bug 268797. https://bugs.webkit.org/show_bug.cgi?id=268797
- [R10] caniuse. https://caniuse.com;数据格式与贡献规则:https://github.com/Fyrd/caniuse/blob/main/CONTRIBUTING.md
- [R11] caniuse tests. https://tests.caniuse.com/
- [R12] mdn/browser-compat-data. Data guidelines. https://github.com/mdn/browser-compat-data/blob/main/docs/data-guidelines/README.md
- [R13] mdn/browser-compat-data. Compat data schema. https://github.com/mdn/browser-compat-data/blob/main/schemas/compat-data-schema.md
- [R14] mdn/browser-compat-data.
api/WakeLock.json. https://github.com/mdn/browser-compat-data/blob/main/api/WakeLock.json - [R15] Open Web Docs. mdn-bcd-collector. https://github.com/openwebdocs/mdn-bcd-collector;结果:https://github.com/openwebdocs/mdn-bcd-results
- [R16] web-platform-tests. “About wpt.fyi.” https://wpt.fyi/about
- [R17] Interop 2026 看板 https://wpt.fyi/interop-2026(仓库阅读:https://github.com/web-platform-tests/interop);Mozilla Hacks, “Launching Interop 2026,” 2026-02-12, https://hacks.mozilla.org/2026/02/launching-interop-2026/
- [R18] W3C WebDX Community Group. web-features, Baseline 定义。https://github.com/web-platform-dx/web-features/blob/main/docs/baseline.md;https://web.dev/baseline
- [R19] webstatus.dev. https://webstatus.dev(仓库阅读:https://github.com/GoogleChrome/webstatus.dev)
- [R20] Chrome Platform Status. https://chromestatus.com(仓库阅读:https://github.com/GoogleChrome/chromium-dashboard)
- [R21] WebKit Feature Status(已停用). https://webkit.org/status/;Apple, Safari release notes, https://developer.apple.com/documentation/safari-release-notes
- [R22] whatpwacando.today. https://whatpwacando.today/
- [R23] HTTP Archive. Web Almanac 2025, “PWA” 章。https://almanac.httparchive.org/en/2025/pwa
- [R34] W3C WebView Community Group. caniwebview. https://caniwebview.com/
- [R35] caniemail. https://www.caniemail.com/;特性数据:https://github.com/hteumeuleu/caniemail
- [R38] WebKit. “WebKit Features in Safari 16.4.” 2023-03-27. https://webkit.org/blog/13966/webkit-features-in-safari-16-4/
研究与标准
- [R24] A. Mesbah, M. R. Prasad. “Automated cross-browser compatibility testing.” ICSE 2011. https://doi.org/10.1145/1985793.1985870
- [R25] S. Roy Choudhary, H. Versee, A. Orso. “WEBDIFF: Automated identification of cross-browser issues in web applications.” ICSM 2010. https://doi.org/10.1109/ICSM.2010.5609723
- [R26] S. Roy Choudhary, M. R. Prasad, A. Orso. “X-PERT: Accurate identification of cross-browser issues in web applications.” ICSE 2013. https://doi.org/10.1109/ICSE.2013.6606616
- [R27] S. Roy Choudhary, M. R. Prasad, A. Orso. “CrossCheck: Combining crawling and differencing to better detect cross-browser incompatibilities in web applications.” ICST 2012. https://doi.org/10.1109/ICST.2012.97
- [R28] T. Steiner. “What is in a Web View? An Analysis of Progressive Web App Features When the Means of Web Access is not a Web Browser.” WWW ’18 Companion. https://doi.org/10.1145/3184558.3188742
- [R29] A. Biørn-Hansen, T. A. Majchrzak, T.-M. Grønli. “Progressive Web Apps: The Possible Web-native Unifier for Mobile Development.” WEBIST 2017. https://doi.org/10.5220/0006353703440351
- [R30] T. A. Majchrzak, A. Biørn-Hansen, T.-M. Grønli. “Progressive Web Apps: the Definite Approach to Cross-Platform Development?” HICSS 2018. https://doi.org/10.24251/HICSS.2018.718
- [R31] ISO/IEC 9646-1:1994. https://www.iso.org/standard/17473.html(该页面我们的客户端无法读取;定义取自 ETSI 的引用 [R32])
- [R32] ETSI. “Conformance and interoperability testing: a comparison.” https://docbox.etsi.org/MTS/MTS/10-PromotionalMaterial/MBS-20111118/Testing/Comparison/comparison.htm
- [R33] W3C. “QA Framework: Specification Guidelines.” W3C Recommendation, 2005-08-17. https://www.w3.org/TR/qaframe-spec/
- [R36] G. H. Guyatt et al. “GRADE: an emerging consensus on rating quality of evidence and strength of recommendations.” BMJ 2008. https://doi.org/10.1136/bmj.39489.470347.AD
- [R37] T. Dybå, T. Dingsøyr. “Strength of evidence in systematic reviews in software engineering.” ESEM 2008. https://doi.org/10.1145/1414004.1414034
- [R39] P. Snyder, L. Ansari, C. Taylor, C. Kanich. “Browser Feature Usage on the Modern Web.” IMC 2016. https://doi.org/10.1145/2987443.2987466
附录:命名
链接到“附录:命名”一节2026-10-20 以网页检索核查了三个候选名称,检索词为该名称加上 Web、浏览器、PWA 等语境。
| 候选 | 撞名核查 | 结论 |
|---|---|---|
| OpenPWA Three-Layer Model(三层模型) | Web 兼容领域未见使用。「三层」「three-tier」是展示层、应用层、数据层架构的通用叫法,单用这个词既泛又难检索。 | 可作描述性说法(「三层模型」),不宜作正式名称 |
| Support–Capability–Behaviour(SCB)模型 | 两种拼写的完整短语均未见使用。近似措辞有澳大利亚 NDIS 的「Positive Behaviour Support Capability Framework」和行为改变领域的 COM-B 模型。缩写 SCB 已被大量占用:暹罗商业银行、渣打银行、瑞典统计局、一款特权访问产品(Shell Control Box),以及一篇题为「Secure Cloud Browser」的 IEEE 论文。 | 三个词保留作副标题;不单独使用缩写 |
| OpenPWA Evidence Layers(OpenPWA 证据分层) | 未见使用。「evidence layers」出现在 2026 年一篇关于安全保证的博客中,讲设计、实现、运行三类证据,属于其他领域的类似思路,不构成冲突。 | 推荐 |
推荐「OpenPWA 证据分层」(OpenPWA Evidence Layers),副标题「支持 / 能力 / 行为」。 名称带有平台名,便于归属和检索;它点明框架讨论的是证据,而不是层数,今后版本即使调整层数也不必改名;它也与 /about/evidence/ 网址一致。行文中仍可非正式地称为「三层模型」。
简短标签:
| 元素 | 英文 | 中文 |
|---|---|---|
| 框架 | OpenPWA Evidence Layers | OpenPWA 证据分层 |
| 第 1 层 | Support | 支持 |
| 第 2 层 | Capability | 能力 |
| 第 3 层 | Behaviour | 行为 |
| 类别 | documented | 文档记载 |
| 类别 | demonstrated | 演示可见 |
| 类别 | measured | 真机实测 |
| 行标记 | Device-tested | 真机实测 |
| 置信标签 | A instrumented read · S screenshot or recording · O observer report | A 仪器读数 · S 截图或录屏 · O 观察者口述 |
| 关系 | agrees · adds a condition · differs | 一致 · 补充条件 · 不符 |
设备操作由 OpenPWA 的一名操作员在 iPhone 16 Pro 上完成。AI 代理会话通过 USB 读取页面状态、记录实验笔记并起草本文;自动门禁和 AI 事实核查做了检查。没有人逐篇审阅。