# 真机实验室方法

> 真机实验室怎样在真机上测量行为：测试流程、事先写下的预期、A 与 S 两种置信度标签、效度威胁，以及还没有测过的内容。

import LabProvenance from '@components/lab/LabProvenance.astro';

真机实验室结果记录在真机上按公开流程测得的行为，属于 [OpenPWA 证据分层](/zh/about/evidence/)中的第 3 层。各层和证据类别的定义见该框架；兼容数据行的置信度另按[方法说明](/zh/about/methodology/)计算。

## 测试流程

一次测试按清单逐项完成，各项都很短，[测试规程](https://openpwa.net/research/2026-10-ios18-home-screen-web-apps/data/PROTOCOL.md)规定每个测试不超过 5 分钟。动手前先读清单中的预期结果和资料出处，确定要观察什么。iOS 18.6.2 基线测试的预期取自厂商文档、browser-compat-data 和本站自己的页面；测试中临时加的步骤，预期在读数之前写进实验笔记（[REPORT.md](https://openpwa.net/research/2026-10-ios18-home-screen-web-apps/data/REPORT.md) 第 5.3 节）。有些发现没有事先记录的预期，例如 T8 中应用一侧的 worker 暴露，实验笔记就没有预先记下预期。操作员在设备上执行这一步，结果记录屏幕和页面实际显示的内容，屏幕文字按界面语言原样引用。结果与预期不同就是一项发现。结论分为 `as-expected`、`differs`、`inconclusive`（这一步区分不了几种可能）和 `could-not-run`。

测试规程要求每台设备每次测试填一次环境信息：设备、系统版本与构建号、发布渠道、Safari 版本、语言与地区、改过的功能标志，以及内容拦截器、VPN 和专用代理的开关。需要干净状态的测试，开始前先删掉主屏图标、清除网站数据。更正以新条目的形式追加到实验笔记里，已有内容一律不改。

### 分工

设备归一名 OpenPWA 操作员所有，点击、改设置、截图和录屏均由这名操作员完成。Mac 上的 AI 代理会话用 USB 连接设备，经 WebKit 远程检查器协议读取页面状态（少数标签页一侧的数值经 `safaridriver` 用 WebDriver 读取），记录实验笔记，并分析截图和录屏。另一个代理会话可能负责在操作员和读数代理之间传递点击清单与提问。这些页面也由代理会话起草。没有人逐条签字确认，[数据包说明](https://openpwa.net/research/2026-10-ios18-home-screen-web-apps/data/README.md)也注明了这一点。

### 读数

一次读数就是在页面里运行一段公开的只读探测脚本，并把输出原样存成 JSON 文件。基线测试从实验笔记 N15 起，每次读数还附一个元数据文件，记录读数时间、工具哈希和所选页面。探测脚本读取特性检测、媒体查询、几何尺寸和存储内容，不请求权限、订阅、分享、安装、注册 worker 或调用 `persist()`。状态变化来自操作员的点击。

## 置信度标签

已发布结果用标签注明证据类别。

| 标签 | 名称 | 含义 | 是否发布 |
|---|---|---|---|
| A | 仪器读数 | 已公开的探测脚本的输出，经 WebKit 远程检查器或 WebDriver 读取并原样保存 | 发布 |
| S | 截图或录屏 | 事后分析的截图或录屏：像素值、画面帧、拍摄时间 | 发布 |
| O | 操作员报告 | 操作员的口头报告 | 不作为实验室结果发布 |

标签可以组合。A+S 表示仪器读数和截图或录屏相互吻合。S+O 表示有截图或录屏，操作员的报告提供背景，比如像素值是测出来的，但屏幕上是哪个应用部分依赖操作员的说法。一条结果发布时，会写明它最薄弱的那个必要环节。只有 O 的记录不能单独支撑实验室结果行。研究报告和实验笔记里确实有只有 O 的说法，都标了 O；REPORT.md 第 11 节逐条列出，它们都不作为实验室结果的依据。后来撤回的读数仍留在实验笔记里，标明撤回，不再引用。

实测结果只对一台设备、一个系统构建、一个日期成立。写「在 iOS 18.6.2（22G100）上」才能限定到测过的构建；「在 iOS 18 上」超出了实测范围。其他构建另列结果行。

## 效度威胁

iOS 18.6.2 基线测试的实验笔记和报告记下了这些局限。后续测试解决之前，实验室结果都受它们影响。

- 已发布的结果只描述一台 iPhone 16 Pro（iPhone17,1）在 22G100 上、于 2026-10-20 测得的情况。没有测过其他型号、iPadOS 或其他构建。
- 测试由一名操作员完成。基线测试中有几次口头报告出了错，共四类：某一步其实没做；误解了某个术语；回答与问题对不上；记错了，以为没有弹出提示。读数或录屏与这些报告矛盾，才发现了错误。没有独立记录的步骤里，可能还藏着同类错误。
- AI 代理会话读取数据、记录实验笔记并分析结果。协调会话转述过一条计划中的步骤，这条转述一度误当成了操作员报告，后来才发现误会。
- 手机没有抹掉重置，上面有其他网站的主屏应用和 Safari 状态，装着一个身份不明的 Safari 网页扩展，功能标志、VPN 和 iCloud 专用代理也没有记录。
- 旧构建无法重装。手机一旦升级到 iOS 27，就再也不能在它上面测 18.6.2。公开的读数、截图和哈希是核查这些结果的唯一途径。
- 基线测试没有对每个测试页文件做哈希快照。只有 `lab.js`、`sw.js` 和 T7 的文件有运行时快照，其余文件以部署时那个提交里的哈希为准。测试期间的一次部署替换了 `lab.js`，受影响的读数都记下了加载的是哪个模块（见 [v1 测试页](/zh/lab/harness/v1/)）。
- 读数会在页面里执行 JavaScript，插入一个隐藏元素并临时挂一个属性。只有前台页面能读取；检查器的页面列表中断过十分钟，部分 T4 和 T11 步骤因此缺了代理读数。
- 颜色值取自截图，截图流程没有用实测显示器校准过。
- 基线测试用了大约三小时，预算是一小时，因为中途加了用来区分不同假设的步骤。这些步骤的预期都在读数之前写好，但不在原来的清单里。

## 还没有测过的内容

基线测试没有测真实的推送送达（没有推送服务器，只测了 `showNotification()` 发出的本地通知）、`notificationclick` 的 `clients.openWindow()` 路径、从第三方浏览器「添加到主屏幕」（T5b）、`sbs-default` 和 `sbs-black` 两种状态栏样式（始终没有安装）、深色外观（只有操作员报告）、服务器设置的 Cookie、`HttpOnly` Cookie、分区 Cookie 和第三方 Cookie，以及作用域在站点根路径的 Service Worker。Android、桌面端 Chromium、Firefox 和 Samsung Internet 都没有实验室结果。其中哪些已列入计划，见[路线图](/zh/lab/roadmap/)。

<LabProvenance locale="zh" />