# iOS 主屏 Web 应用中的 Safari 存储与 Cookie

> 在 iOS 18.6.2 上，localStorage 与 IndexedDB 不会复制进主屏应用；一个第一方 Cookie 复制了一次，此后每个应用各有自己的存储。

import LabEvidenceLine from '@components/lab/LabEvidenceLine.astro';
import LabHarnessLinks from '@components/lab/LabHarnessLinks.astro';
import LabResults from '@components/lab/LabResults.astro';
import LabBacks from '@components/lab/LabBacks.astro';
import LabProvenance from '@components/lab/LabProvenance.astro';

<LabEvidenceLine behaviour="storage-isolation-and-cookie-copy" locale="zh" />

<span id="问题"></span>

把网站添加到 iOS 18.6.2 的主屏幕时，Safari 中的 localStorage、IndexedDB 和 Cookie 有哪些会进入新的 Web 应用？复制发生在什么时候？之后的写入会不会在 Safari 与应用之间、或同一网站的两个主屏应用之间，朝任一方向传过去？

Cookie 复制了一次，此后各应用独立保存；localStorage 和 IndexedDB 都没有复制进实验室应用。测试在 2026-10-20 完成，使用 iPhone 16 Pro、iOS 18.6.2（22G100）。

<span id="测了什么"></span>

## 安装前写入存储标记

安装任何应用之前，先在 Safari 中写入两个标记。

- 在演示应用 `/demo/` 中切换语言，会把 `openpwa-demo-lang` 存进 localStorage。Safari 标签页设为 `zh`（N08）。
- 在实验室页面 `/lab/device-tests/` 中点按 **Write marker here**，会把同一个值同时写进三处，即 localStorage、IndexedDB 和 Cookie `openpwa_lab_marker`。值在 Safari 中以 `TAB-` 开头，在应用中以 `APP-` 开头，后面跟 UTC 时间。Cookie 由 `document.cookie` 设置，属性为 `path=/lab/device-tests/; max-age=31536000; SameSite=Lax; Secure`。Safari 写入的值是 `TAB-2026-10-20T07:13:46Z`（N09）。

随后在约 07:16 至 07:20 UTC 之间，从 Safari 添加了三个主屏应用，分别是演示应用（`/demo/`）、PWA Lab（`/lab/device-tests/`，带 Service Worker）和 Lab no-ATI（`/lab/device-tests/t3/manifest-only/`，自己的 manifest 和作用域，没有 Service Worker，在 Cookie 的 path 之内）。每一步之后，代理都通过 USB 在相应环境中读取标记。多数步骤中，「共享」和「隔离」会得到不同的值；演示应用的一步无法区分两者（N14），之后补做了能区分的检查（N16、N17）。我们在关键读数前就把 Cookie 的两种假设写进实验笔记，分别是只复制一次，或共用同一个实时 Cookie 存储（N18）。

为了判断 Cookie 复制的时间点，Lab no-ATI 添加后一直没有启动；Safari 写入新值后 7 s，才第一次启动它（N21、N22）。

## 怎么运行

先删掉之前的 PWA Lab、Lab no-ATI 和 OpenPWA 图标，以干净状态开始。测试过程中不要清除 Safari 的网站数据。

1. 在 Safari 中打开 `https://openpwa.net/lab/device-tests/#t6`，点按 **Write marker here**，记下 `TAB-…` 值。
2. **分享** → **添加到主屏幕** → **添加**（PWA Lab）。再添加 `https://openpwa.net/lab/device-tests/t3/manifest-only/`（Lab no-ATI），先不要打开。
3. 从图标打开 PWA Lab，查看 T6 标记面板。某个存储显示 `null`，说明没有复制进去；显示 `TAB-…`，说明 Safari 的值在那里。
4. 在应用中点按 **Write marker here**（`APP-…`）。切到 Safari，重新载入实验室页面。如果 Safari 三处仍是 `TAB-…`，说明应用的写入没有传到 Safari。
5. 在 Safari 中再点一次 **Write marker here**（新的 `TAB-…`）。等至少两分钟，再第一次打开 Lab no-ATI。读到旧的 `TAB-…` 指向添加到主屏幕时复制，读到新值指向首次启动时复制。
6. 把 Lab no-ATI 的 Cookie 和 PWA Lab 的 `APP-…` 对比，看同一网站的两个应用是否共用 Cookie 存储。
7. 使用网页检查器时，也可以在各环境的控制台用 `document.cookie` 和 `localStorage.getItem('openpwa-lab-marker')` 读取标记。

<LabHarnessLinks behaviour="storage-isolation-and-cookie-copy" locale="zh" />

## 结果

在 iOS 18.6.2 上，localStorage 和 IndexedDB 没有复制进任何一个实验室应用，之后两个方向也都保持隔离；Cookie 则从 Safari 复制进每个应用一次，此后各自独立（A，N18 至 N22）。

| 时间（UTC） | 环境 | localStorage | IndexedDB | Cookie | 笔记 |
|---|---|---|---|---|---|
| 07:13:46 | Safari 写入 | TAB-07:13:46Z | TAB-07:13:46Z | TAB-07:13:46Z | N09 |
| 约 07:16 | 添加 PWA Lab 与 Lab no-ATI | | | | N11 |
| 07:34:15 | PWA Lab 首次启动后的读取 | null | null | TAB-07:13:46Z | N18 |
| 07:37:40 | PWA Lab 写入 | APP-07:37:40Z | APP-07:37:40Z | APP-07:37:40Z | N20 |
| 07:38:18 | Safari 重新载入 | TAB-07:13:46Z | TAB-07:13:46Z | TAB-07:13:46Z | N19 |
| 07:45:25 | Safari 写入 | TAB-07:45:25Z | TAB-07:45:25Z | TAB-07:45:25Z | N22 |
| 07:45:32.575 | Lab no-ATI 首次启动 | null | null | TAB-07:13:46Z | N21 |

每个主屏应用都有自己的 Cookie 存储。Lab no-ATI 看不到 PWA Lab 的 `APP-…` Cookie，尽管 Cookie 的 path 覆盖两者，两者也运行在同一个 Web 应用进程里（A，N21）。

Lab no-ATI 拿到的是添加它时 Safari 持有的值，首次启动前 7 s Safari 写入的新值没有复制过来，这与「添加到主屏幕时复制」相符；时间点的判断强度为中等。

演示标记的结果一致。演示应用以英文启动，localStorage 为空，没有 Cookie（A，N13）；之后 Safari 中的语言变更没有传到应用（N16），应用自己后来的写入也没有传到 Safari（N17）。N16 和 N17 中读取的一侧有仪器读数（A），另一侧依据操作员的报告（O）。

Service Worker 注册也没有传过去。演示应用只列出一个 `/demo/` 注册，看不到 Safari 的实验室注册（A，N13）；PWA Lab 也看不到演示应用的注册，尽管两个应用运行在同一个进程里（A，N18）。置信标签为 A。

<LabResults behaviour="storage-isolation-and-cookie-copy" locale="zh" />

<span id="文档怎么说"></span>

## WebKit 的 Cookie 复制与存储隔离

WebKit 的防跟踪页面说，主屏 Web 应用的网站数据与 Safari 隔离（"the website data of home screen web applications is kept isolated from Safari"，[Tracking Prevention in WebKit](https://webkit.org/tracking-prevention/)，webkit.org），WebKit 缺陷 181849 也把这种分隔视为有意设计（[Bug 181849](https://bugs.webkit.org/show_bug.cgi?id=181849)，bugs.webkit.org）。Safari 17.2 的文章针对 iOS 17.2 的 Cookie 做了细化。用户点按「添加到主屏幕」创建 Web 应用时，Cookie 会复制过去，包括登录状态；其他本地存储都不复制；添加之后不再共享任何网站数据（[WebKit Features in Safari 17.2](https://webkit.org/blog/14787/webkit-features-in-safari-17-2/)，webkit.org）。Firtman 的笔记列出自 17.2 起「登录 Cookie 复制到已安装应用」，存储不与浏览器共享（[iOS PWA Compatibility](https://firt.dev/notes/pwa-ios/)，firt.dev）。

实测与 WebKit 的 Safari 17.2 描述一致，18.6.2 的读数附有时间戳，复现了这一行为。单看防跟踪页面那句话，会漏掉一次性的 Cookie 复制，所以这两份 WebKit 资料应当一起引用。本次只检查了一种 Cookie。读数还显示，Lab no-ATI 拿到的是添加时 Safari 中的值，首次启动前 7 s Safari 刚写入的值没有复制过来（中等强度，N22，不能排除首次启动时复制了尚未写入磁盘的 Cookie 存储）；同一网站的两个应用不共用 Cookie 存储，这一点两篇文章都没有写明。本次测试的已有资料核查把这一结果算作确认，不算新发现。面向开发者的隔离模型见 [iOS 上主屏 Web 应用的存储隔离](/zh/reference/storage/home-screen-storage-isolation/)。

## 数据

来自 [iOS 18.6.2 数据包](/zh/research/2026-10-ios18-home-screen-web-apps/data/)（CC BY 4.0）；从第 11 步起的读数另有 `.meta.json` 附带文件（UTC 时间、工具哈希、所选页面）。

- [`raw/2026-10-20-ios18.6.2-step12-app-lab.json`](/research/2026-10-ios18-home-screen-web-apps/data/raw/2026-10-20-ios18.6.2-step12-app-lab.json)，PWA Lab 首次启动（N18）。
- [`raw/2026-10-20-ios18.6.2-step13-tab-t3-marker.json`](/research/2026-10-ios18-home-screen-web-apps/data/raw/2026-10-20-ios18.6.2-step13-tab-t3-marker.json)，应用写入后的 Safari（N19）。
- [`raw/2026-10-20-ios18.6.2-step13b-app-lab-marker.json`](/research/2026-10-ios18-home-screen-web-apps/data/raw/2026-10-20-ios18.6.2-step13b-app-lab-marker.json)，PWA Lab 的对照读数（N20）。
- [`raw/2026-10-20-ios18.6.2-step13c-app-noati-marker.json`](/research/2026-10-ios18-home-screen-web-apps/data/raw/2026-10-20-ios18.6.2-step13c-app-noati-marker.json)，Lab no-ATI 首次启动（N21）。
- [`raw/2026-10-20-ios18.6.2-step13d-tab-lab-marker.json`](/research/2026-10-ios18-home-screen-web-apps/data/raw/2026-10-20-ios18.6.2-step13d-tab-lab-marker.json)，Safari 的对照读数（N22）。
- [`raw/2026-10-20-ios18.6.2-step09-app-demo.json`](/research/2026-10-ios18-home-screen-web-apps/data/raw/2026-10-20-ios18.6.2-step09-app-demo.json)、[`raw/2026-10-20-ios18.6.2-step11-app-demo.json`](/research/2026-10-ios18-home-screen-web-apps/data/raw/2026-10-20-ios18.6.2-step11-app-demo.json) 和 [`raw/2026-10-20-ios18.6.2-step11b-tab-demo.json`](/research/2026-10-ios18-home-screen-web-apps/data/raw/2026-10-20-ios18.6.2-step11b-tab-demo.json)，演示标记（N13、N16、N17）。

实验笔记 N08 至 N22 见 [`2026-10-ios18-baseline.md`](/research/2026-10-ios18-home-screen-web-apps/data/2026-10-ios18-baseline.md)。记录见 [`/lab/results.json`](/lab/results.json)。引用时写作「OpenPWA device test, 2026-10-20, iPhone 16 Pro, iOS 18.6.2 (22G100), N21」。

<span id="支撑的条目"></span>

## 相关参考条目

这一结果支撑关于 iOS 已安装 Web 应用的 Cookie 复制与存储隔离的说法。

<LabBacks behaviour="storage-isolation-and-cookie-copy" locale="zh" />

## 局限

- 只测了一种 Cookie，属性为第一方、由 `document.cookie` 设置、`Secure`、`SameSite=Lax`、带 path。没有测试 `HttpOnly` 等由服务器设置的 Cookie、`SameSite=None`、会话 Cookie 和分区 Cookie。
- 没有测试 CacheStorage、源私有文件系统，也没有测试从 SFSafariViewController 或其他浏览器添加（17.2 的文章也涵盖这些情形）。
- 复制时间点的判断强度为中等。Safari 写入与首次启动之间只隔 7 s，仍有可能是首次启动时从尚未写入磁盘的 Safari Cookie 存储复制。更强的复测（添加、在 Safari 中写入新值、等至少两分钟、再启动）在 N22 中提出，没有执行。
- 演示标记在 N16 和 N17 中有一侧依据操作员的报告。
- 手机没有抹掉数据。自带独立空存储的 WebDriver 自动化会话没有用于任何存储步骤。
- 一台 iPhone 16 Pro、一个版本、一名操作员；没有在 iOS 26 及以后的版本上测试。

<LabProvenance locale="zh" />