行为 · 实测 2026-10-20,iPhone 16 Pro,iOS 18.6.2 (22G100) · A,仪器读数 · 没有文档来源
在 iOS 18.6.2 的 App 切换器中划走主屏 Web 应用后,页面是否立即结束?几秒后处理通知点按的 Service Worker 用 clients.matchAll() 还能不能找到可聚焦的窗口?
划走应用约 6 s 后,原页面还在,点按通知聚焦了它。我们在 2026-10-20 用 iPhone 16 Pro、iOS 18.6.2(22G100)记录了这次结果。
这个问题出自 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 中,划走演示应用,再从图标重新打开。
- 从 Safari 把
https://openpwa.net/lab/device-tests/ 添加到主屏幕,从图标打开 PWA Lab。
- 在 T7 and T8 部分点按 1. Request permission,允许通知。
- 使用网页检查器(Mac Safari → 开发 → 你的 iPhone → PWA Lab),记下页面的
performance.timeOrigin。
- 点按 2b. Show in 5 s (then go Home),立即打开 App 切换器,把 PWA Lab 划走。
- 横幅出现后点按它,应用回到前台。
- 查看 Notification event log 中最新的记录:监听器的记录写明结果(「focused existing window」或「opened new window」)和找到的窗口数。
- 再读一次
performance.timeOrigin。与第 3 步相同,说明同一个文档在划走后仍然存活。
- 如需更长的间隔,在第 4 步和第 5 步之间等待固定时间并记录;本次测试没有这样做。
- T8 notificationclick 的暴露、处理函数与通知点击(5 分钟)
测试页 v1:打开测试
在 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。
2026-10-20,iOS 18.6.2
在点击通知之前大约 6 秒,PWA Lab 应用已在多任务界面里被上划关闭,但上一次启动时的文档仍然存活,clients.matchAll() 找到了它。更早一次上划关闭 demo 应用时,Web 应用的进程号没有变,页面在重新启动时重新加载。测试原本假定上划关闭后不会留下窗口。
- 日期
- 2026-10-20
- 设备
- iPhone 16 Pro
- 系统版本与构建号
- iOS 18.6.2 (22G100),正式版
- 环境
- 主屏应用
- 结果
- 与预期不符
- 关键数值
documentAliveAfterSwipeAwayS: 6clientsMatchAllWindows: 1processIdSurvivedSwipeAway: true
- 可信度
- A,仪器读数
- 测试
- T8
- 实验笔记条目
- N16, N38, N40
- 研究
- 阅读研究 · 数据包
- 测试页
- 测试页 v1
使用的测试页 v1 文件(2 个),线上字节的 SHA-256
/lab/device-tests/ 42c90845419f5ed3ad15d941bea04f649f4c5d350b1847292292fadd55871486/lab/device-tests/sw.js 0e7e6f34cb814d808edba644d664bac0f4337cc59a88dbb509d25a8e11fffc30
单看进程号说明不了什么:PID:24500 同时承载 PWA Lab、演示应用、Lab no-ATI 和另一个网站的页面(N18、N21,异常 A3),所以划走一个应用后进程还在,是意料之中的。由于每次点按时都有窗口存活,用这种方法走不到 notificationclick 的 clients.openWindow() 分支(could-not-run)。
Service Worker 规范规定 clients.matchAll() 返回调用时存在的窗口客户端,clients.openWindow() 打开一个新的顶层浏览上下文(Service Workers,matchAll() 与 openWindow(),w3.org)。规范以及 Apple 和 WebKit 的文档都没有说明用户划走主屏 Web 应用后,页面还会存活多久。
WebKit 缺陷 268797「notificationclick events in serviceworkers not firing」状态为 NEW,其中有报告说,在应用没有任何页面存活时点按通知,事件不会触发(Bug 268797,bugs.webkit.org)。本次每次点按都触发了 notificationclick,但每次都有页面存活,所以既不能证实也不能反驳这些报告。
没有第一层来源记载页面划走后的存活时间,因此无法判定实测与来源一致或不符。复现这个缺陷时需要留意,在 iOS 18.6.2 上,划走应用并不能稳定地在几秒内造成「没有窗口存活」的状态,测试这种状态时要先用读数确认点按前没有任何页面,例如在设备重启之后。本次测试不把它算作新发现,它是记录在 REPORT §7.8 中的方法性结果。Worker 一侧见 Clients API 和 iOS 与 iPadOS 上的 Web Push(16.4+)。
来自 iOS 18.6.2 数据包(CC BY 4.0):
实验笔记 N16、N38、N39 和 N40 见 2026-10-ios18-baseline.md,REPORT.md 的 T8 部分列出了全部六次点按。记录:/lab/results.json。引用格式:「OpenPWA device test, 2026-10-20, iPhone 16 Pro, iOS 18.6.2 (22G100), N40」。
Service Worker 生命周期与 notificationclick 的相关说法,需要区分划走已安装应用后窗口是否还在;这次结果提供了实测依据。
- 决定性的情形只有一次(N40)。划走的时刻没有时间戳,间隔依据通知的创建与点按时间,以及实验笔记中的「约 6 s」。
- 没有测试更长的间隔、设备重启、内存压力和低电量模式,所以本次测试不能说明 iOS 何时才会结束页面。
- N16 和 N38 中划走与重新打开之间的时间没有记录,因此那两次的重新载入无法与 N40 的间隔比较。
- 没有走到
clients.openWindow() 分支,也没有 notificationclose 记录。
- 一台 iPhone 16 Pro、一个版本、一名操作员;没有在 iOS 26 及以后的版本上测试。
设备操作由 OpenPWA 的一名操作员在 iPhone 16 Pro 上完成。AI 代理会话通过 USB 读取页面状态、记录实验笔记并起草本文;自动门禁和 AI 事实核查做了检查。没有人逐篇审阅。