# iOS 18 主屏 Web 应用划走后页面的存活时间

> 在 iOS 18.6.2 上，主屏应用在 App 切换器中被划走后，页面约 6 s 后仍然存活，通知点按聚焦的是这个页面。

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="page-survives-swipe-away" locale="zh" />

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

在 iOS 18.6.2 的 App 切换器中划走主屏 Web 应用后，页面是否立即结束？几秒后处理通知点按的 Service Worker 用 `clients.matchAll()` 还能不能找到可聚焦的窗口？

划走应用约 6 s 后，原页面还在，点按通知聚焦了它。我们在 2026-10-20 用 iPhone 16 Pro、iOS 18.6.2（22G100）记录了这次结果。

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

## 划走前后的文档身份

这个问题出自 `notificationclick` 测试（T8）。实验室 Service Worker 处理点按时先调用 `clients.matchAll({type: "window", includeUncontrolled: true})`，找到窗口就聚焦，找不到就调用 `clients.openWindow()`，并把找到的窗口数和结果（「focused existing window」或「opened new window」）写进 IndexedDB。为了走到 `openWindow()` 分支，操作员先把应用划走，想让窗口消失。

我们用仪器读取文档的 `performance.timeOrigin`、导航类型和 `history.length` 来辨认是否为同一页面，再从检查器的页面列表查看所属进程。共读取三种情形：

- 决定性的一次是 N40。在 PWA Lab 中点按 **2b. Show in 5 s (then go Home)**，立即在 App 切换器中划走应用，横幅出现后点按它。
- N38 中，划走 PWA Lab，从图标重新打开，再 **2b**、回主屏幕、点按横幅。
- N16 中，划走演示应用，再从图标重新打开。

## 怎么运行

1. 从 Safari 把 `https://openpwa.net/lab/device-tests/` 添加到主屏幕，从图标打开 PWA Lab。
2. 在 T7 and T8 部分点按 **1. Request permission**，允许通知。
3. 使用网页检查器（Mac Safari → **开发** → 你的 iPhone → PWA Lab），记下页面的 `performance.timeOrigin`。
4. 点按 **2b. Show in 5 s (then go Home)**，立即打开 App 切换器，把 PWA Lab 划走。
5. 横幅出现后点按它，应用回到前台。
6. 查看 **Notification event log** 中最新的记录：监听器的记录写明结果（「focused existing window」或「opened new window」）和找到的窗口数。
7. 再读一次 `performance.timeOrigin`。与第 3 步相同，说明同一个文档在划走后仍然存活。
8. 如需更长的间隔，在第 4 步和第 5 步之间等待固定时间并记录；本次测试没有这样做。

<LabHarnessLinks behaviour="page-survives-swipe-away" locale="zh" />

## 结果

在 iOS 18.6.2 上，划走应用并没有在几秒内结束页面。N40 中，通知于 08:43:03.022 UTC 创建，操作员于 08:43:09 点按它；Worker 的监听器找到一个窗口（`windowsFound` 1），于 08:43:09.236Z 记录「focused existing window」，属性处理函数于 08:43:09.245Z 记录这次点按。之后读到的文档 `timeOrigin` 与 N38 重新打开时载入的页面相同（08:28:30.036Z 对 08:28:29.978Z，在多次读取 `timeOrigin` 的舍入误差之内，两次 `history.length` 都是 1），所以同一个文档约 6 s 后仍然存活（A，N40）。

划走后再从图标打开时，页面会重新载入：PWA Lab（A，N38）和演示应用（A，N16）都得到一个新文档，导航类型 `navigate`，`history.length` 1。每次划走前后，Web 应用进程号都是 PID:24500。置信标签为 A。

<LabResults behaviour="page-survives-swipe-away" locale="zh" />

单看进程号说明不了什么：PID:24500 同时承载 PWA Lab、演示应用、Lab no-ATI 和另一个网站的页面（N18、N21，异常 A3），所以划走一个应用后进程还在，是意料之中的。由于每次点按时都有窗口存活，用这种方法走不到 `notificationclick` 的 `clients.openWindow()` 分支（could-not-run）。

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

## 窗口客户端与无页面时的缺陷报告

Service Worker 规范规定 `clients.matchAll()` 返回调用时存在的窗口客户端，`clients.openWindow()` 打开一个新的顶层浏览上下文（[Service Workers，`matchAll()`](https://w3c.github.io/ServiceWorker/#clients-matchall) 与 [`openWindow()`](https://w3c.github.io/ServiceWorker/#clients-openwindow)，w3.org）。规范以及 Apple 和 WebKit 的文档都没有说明用户划走主屏 Web 应用后，页面还会存活多久。

WebKit 缺陷 268797「notificationclick events in serviceworkers not firing」状态为 NEW，其中有报告说，在应用没有任何页面存活时点按通知，事件不会触发（[Bug 268797](https://bugs.webkit.org/show_bug.cgi?id=268797)，bugs.webkit.org）。本次每次点按都触发了 `notificationclick`，但每次都有页面存活，所以既不能证实也不能反驳这些报告。

没有第一层来源记载页面划走后的存活时间，因此无法判定实测与来源一致或不符。复现这个缺陷时需要留意，在 iOS 18.6.2 上，划走应用并不能稳定地在几秒内造成「没有窗口存活」的状态，测试这种状态时要先用读数确认点按前没有任何页面，例如在设备重启之后。本次测试不把它算作新发现，它是记录在 REPORT §7.8 中的方法性结果。Worker 一侧见 [Clients API](/zh/reference/service-worker/clients-api/) 和 [iOS 与 iPadOS 上的 Web Push（16.4+）](/zh/reference/notifications/ios-safari-push/)。

## 数据

来自 [iOS 18.6.2 数据包](/zh/research/2026-10-ios18-home-screen-web-apps/data/)（CC BY 4.0）：

- [`raw/2026-10-20-ios18.6.2-step24b-app-lab-events.json`](/research/2026-10-ios18-home-screen-web-apps/data/raw/2026-10-20-ios18.6.2-step24b-app-lab-events.json) 及其 `.meta.json`：N40 的读数（记录 11 和 12，文档身份）。
- [`raw/2026-10-20-ios18.6.2-step24-app-lab-events.json`](/research/2026-10-ios18-home-screen-web-apps/data/raw/2026-10-20-ios18.6.2-step24-app-lab-events.json)：N38 的重新打开（记录 9 和 10）。
- [`raw/2026-10-20-ios18.6.2-step11-app-demo-timing.json`](/research/2026-10-ios18-home-screen-web-apps/data/raw/2026-10-20-ios18.6.2-step11-app-demo-timing.json)：演示应用划走后重新打开（N16）。

实验笔记 N16、N38、N39 和 N40 见 [`2026-10-ios18-baseline.md`](/research/2026-10-ios18-home-screen-web-apps/data/2026-10-ios18-baseline.md)，[`REPORT.md`](/research/2026-10-ios18-home-screen-web-apps/data/REPORT.md) 的 T8 部分列出了全部六次点按。记录：[`/lab/results.json`](/lab/results.json)。引用格式：「OpenPWA device test, 2026-10-20, iPhone 16 Pro, iOS 18.6.2 (22G100), N40」。

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

## 相关参考条目

Service Worker 生命周期与 `notificationclick` 的相关说法，需要区分划走已安装应用后窗口是否还在；这次结果提供了实测依据。

<LabBacks behaviour="page-survives-swipe-away" locale="zh" />

## 局限

- 决定性的情形只有一次（N40）。划走的时刻没有时间戳，间隔依据通知的创建与点按时间，以及实验笔记中的「约 6 s」。
- 没有测试更长的间隔、设备重启、内存压力和低电量模式，所以本次测试不能说明 iOS 何时才会结束页面。
- N16 和 N38 中划走与重新打开之间的时间没有记录，因此那两次的重新载入无法与 N40 的间隔比较。
- 没有走到 `clients.openWindow()` 分支，也没有 `notificationclose` 记录。
- 一台 iPhone 16 Pro、一个版本、一名操作员；没有在 iOS 26 及以后的版本上测试。

<LabProvenance locale="zh" />