# 提交真机实验室测试结果

> 怎样通过邮件把真机实验室的测试结果发给 OpenPWA：从测试页复制哪段 JSON、里面有哪些字段，以及邮件里还要补充什么。

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

在自己的设备上跑完真机实验室测试，把结果发到 `re-openpwa@inbox.withretide.com`。测试页没有上传表单。实验室应用的脚本 [lab.js](/lab/device-tests/lab.js) 在文件开头写明它不发送任何数据（没有 fetch，没有 beacon，没有统计），点复制按钮才会把结果写入剪贴板，再把 JSON 粘贴到邮件里。

## 复制 JSON

实验室应用（[/lab/device-tests/](/lab/device-tests/)）上的按钮是 **Copy results as JSON**，T7 权限测试应用（[/lab/device-tests/t7/perm/](/lab/device-tests/t7/perm/)）上是 **Copy JSON**。两者都先尝试写入剪贴板；无法写入剪贴板时，会在文本框里选中 JSON，你可以从菜单里手动拷贝。每个环境各复制一次：Safari 标签页一次，主屏应用一次。

## JSON 里有什么

实验室应用导出的 JSON 字段定义在 [lab.js](/lab/device-tests/lab.js) 中。

| 字段 | 内容 |
|---|---|
| `collectedAt` | 读数时间，取自 `new Date().toISOString()` |
| `page`、`referrer` | 页面 URL 与 `document.referrer` |
| `userAgent` | `navigator.userAgent` |
| `context` | 以 `app` 或 `browser tab` 开头的标签，后面跟着匹配到的 `display-mode` 和 `navigator.standalone` 的值 |
| `navigator.standalone`、`displayModes` | standalone 标志，以及每个 `display-mode` 媒体查询的结果 |
| `viewport` | 内部尺寸、屏幕尺寸、像素比、方向和安全区边距 |
| `declarations` | 页面声明的 manifest 链接、apple-touch-icon、`theme-color` 和状态栏 meta 标签 |
| `featureDetects` | 当前环境里存在哪些 API |
| `serviceWorker` | 注册结果、页面是否受 worker 控制，以及 worker 暴露了什么 |
| `push` | 是否存在订阅，及其 `endpointHost` |
| `storageMarker` | 写在 localStorage、IndexedDB 和 Cookie 里的测试标记 |
| `lastEventLocalStorage`、`recentEventsIndexedDB` | 页面存在 localStorage 里的最后一条通知事件，以及 worker 记在 IndexedDB 里的最多十条近期事件 |

T7 权限测试应用的 JSON 包含 `test`、`page`、`userAgent`、`state`（通知权限、注册对象和 `window.pushManager` 各自的推送权限状态、显示模式、`navigator.standalone`、控制页面的 worker 和各个注册作用域）、`lastRequest`，以及事件 `log`。

两个应用记录推送订阅时都只保留端点的主机名，例如 `web.push.apple.com`，取自 `new URL(endpoint).host`。端点路径和订阅密钥都不在这两份 JSON 里。

## 写邮件

主题写上测试编号、系统版本和构建号，例如 `T7 iOS 18.6.2 22G100`。正文附上以下内容。

1. 环境信息（见 [iPhone 与 iPad 指南](/zh/lab/guides/iphone-ipad/)），不要写序列号、UDID、Apple 账户或手机号；
2. 每个测试的结果字段：结果、观察、数值、截图文件名、用时；
3. JSON，每个环境一段；
4. 你加载的测试页文件的哈希，或者与 harness v1 哈希清单 [/lab/harness/v1/SHA256SUMS.txt](/lab/harness/v1/SHA256SUMS.txt) 不一致的那几行。

截图附上之前先按[命名与打码指南](/zh/lab/guides/screenshots-and-naming/)处理：不能有其他 App 的内容，不能有标识符。逐项说明测试前是否删掉图标、清掉网站数据，以干净状态开始。

<LabProvenance locale="zh" />