跳转到内容

iOS 主屏 Web 应用的通知权限提示

发布于

行为实测 2026-10-20,iPhone 16 Pro,iOS 18.6.2 (22G100)A,仪器读数与 WebKit 一致

iOS 上的主屏 Web 应用用 Notification.requestPermission() 请求通知权限。2026-10-20,在 iPhone 16 Pro、iOS 18.6.2(22G100)上录下的一次请求弹出了系统提示。Promise 等到用户作答才结束,耗时 2068 ms。

在一个还没有请求过通知权限的 iOS 主屏 Web 应用中,由点按触发的 Notification.requestPermission() 会不会弹出系统提示?Promise 会不会一直挂起,直到用户作答?

我们为这一步单独安装了「Perm Test」,它此前从未请求过通知权限。应用位于 /lab/device-tests/t7/perm/,有自己的 manifest、作用域和 Service Worker。它的页面打印三个权限值,并为每次请求留下日志:

  • Notification.permission;
  • 应用注册上的 registration.pushManager.permissionState({userVisibleOnly: true});
  • window.pushManager.permissionState({userVisibleOnly: true}),即 Declarative Web Push 的管理器;
  • 每次请求的墙钟起止时间(Date.now())、用 performance.now() 测得的耗时,以及最终结果。

点按前(实验记录 N53)和作答后(N54)各通过 USB 读一次,请求期间操作员录了屏(N59)。另有两个上下文提供佐证:「PWA Lab」应用,操作员的截图里有这个提示(N58);以及普通 Safari 标签页,检查了接口是否存在(N03、N10)。演示应用里的提示(N41)只有操作员的口头报告,这里不使用。

测试需要一个还没有请求过权限的应用。删掉再重新添加应用是否会重置权限,没有测试过,所以用全新安装的应用。

  1. 从控制中心开始录屏。
  2. 在 Safari 中打开 https://openpwa.net/lab/device-tests/t7/perm/,点按分享,选添加到主屏幕,再点添加。从黄色的 P7 图标打开 Perm Test。
  3. 点按 1. Read state (no request)。从未请求过权限的应用会显示 default 和两个 prompt。
  4. 点按 2. Request permission。记下是否出现系统提示及其原文,然后作答。
  5. 停止录屏。读出页面上的「Last request (start / end / elapsed / result)」,再点按一次 1. Read state (no request)。
  6. 把耗时与录屏中的提示对照。如果有了结果、屏幕上却没出现过提示,说明请求未经用户作答就已结束。

在 iOS 18.6.2(22G100)上,从未请求过权限的 Perm Test 应用在点按前读到 default,两个 permissionState 都是 prompt(仪器读数,A;N53)。请求在 09:27:59.551 UTC 开始,09:28:01.620 UTC 结束,耗时 2068 ms,结果为 "granted";之后三个值都读为 granted(A;N54)。录屏中系统提示出现在原始文件的约 70.6 s 至 72.5 s(公开的文件裁掉了开头 1.0 s,对应约 69.6 s 至 71.5 s),与页面记录的起止时间在录屏 1 s 的时间戳精度内吻合(截图或录屏,S;N59)。在 zh-CN 界面下,提示标题为「“Perm Test”想给你发送通知」,正文为「通知可能包括提醒、声音和图标标记。可在“设置”中配置相关功能。」,按钮为「不允许」和「允许」。在这一精度内,提示正好出现在页面记录的那段时间里,说明请求一直等到用户作答才结束。

在 PWA Lab 应用中,08:17:36 UTC 的截图显示了带有它自己名称的同一种提示(S;N58),它的权限在首次启动时为 default,点按后为 granted(A;N18、N32)。两个应用中,一次授权都同时把注册上的和 window.pushManager 上的 permissionState 变为 granted(A;N32、N54)。之后「设置 → 通知」中列出了 PWA Lab 和 OpenPWA 演示应用,均为「横幅、声音、标记」(S;N61)。Safari 标签页中没有 Notification 和 PushManager,在那里无法发起请求(A;N03、N10)。

2026-10-20,iOS 18.6.2

Perm Test 是一个从未弹过权限请求的主屏应用。点击之后系统弹窗出现,Notification.requestPermission() 一直挂起到用户作答:2068 ms,结果为 granted。录屏里能看到这个弹窗。

日期
2026-10-20
设备
iPhone 16 Pro
系统版本与构建号
iOS 18.6.2 (22G100),正式版
环境
主屏应用
结果
符合预期
关键数值
  • stateBefore: default
  • promptAfterTap: true
  • requestPermissionPendingMs: 2068
  • result: granted
可信度
A,仪器读数
测试
T7
实验笔记条目
N53, N54, N58, N59
研究
阅读研究 · 数据包
测试页
测试页 v1
使用的测试页 v1 文件(3 个),线上字节的 SHA-256
  • /lab/device-tests/t7/perm/ b7240ef04a15035c88668ad1c24333f47ffc005e22d4d51af6d4d1fb88ef3eeb
  • /lab/device-tests/t7/perm/manifest.webmanifest e667b5f34c2c41f658a172b930c955a8544118c2b99952b01df51c64973fb4b0
  • /lab/device-tests/t7/perm/sw.js 6a22bfccf256d296281167088a45904d36acbf590075b7eede5efa89bb9013dd

WebKit 的 iOS 16.4 文章要求主屏 Web 应用的权限请求跟随用户手势(Web Push for Web Apps on iOS and iPadOS,webkit.org)。Notifications API 标准规定 requestPermission() 返回一个 Promise,权限确定后以该权限兑现(Notifications API,whatwg.org)。BCD 把 iOS 版 Safari 的 api.Notification 记为 16.4 起部分支持,备注说该接口只存在于保存到主屏幕的 Web 应用中(Notification.json,github.com)。实测与这三个来源一致,记录了提示在一种界面语言下的原文和请求挂起的时长。一次授权还同时设定了两个推送管理器的 permissionState,这一点三个来源都没有写到(permissionState() 方法本身定义在 Push API 中,w3.org)。这不是新发现。

协调会话转述的「第 19 步出现了提示」只是复述计划步骤,不能作为证据(N32-b)。操作员后来又说第 19 步没有出现提示,但操作员自己的截图与这份口述矛盾(N32-a、N58)。两份说法都不要引用。本次运行中没有任何记录表明 iOS 不弹提示就授予了权限。

这些值在研究的数据包中(CC BY 4.0):raw/2026-10-20-ios18.6.2-25c-pre-app-perm.json(N53)与 raw/2026-10-20-ios18.6.2-25c-post-app-perm.json(N54),各带一个 .meta.json 附带文件;PWA Lab 的读数在 raw/2026-10-20-ios18.6.2-step19-app-lab-perm.json(N32)。录屏为 recording/2026-10-20_iphone16pro_ios18.6.2_T7_25c_trimmed.mp4,另有提示出现前、出现时(…_frame_t071.5s_prompt.png)和消失后的关键帧;PWA Lab 的提示截图为 screenshots/2026-10-20_iphone16pro_ios18.6.2_T7_2.png。机器可读的运行记录在 /lab/results.json 中,id 为 notification-permission-prompt/2026-10-20-ios-18.6.2-22g100。

这一结果支撑 iOS 与 iPadOS 上的 Web Push 中关于权限的段落、Notification.requestPermission() 的 iOS 备注,以及通知权限兼容性数据中 iOS 版 Safari 一行。

  • 一台设备、一个版本、一名操作员、一个测试日:iOS 18.6.2(22G100)的 iPhone 16 Pro,界面语言为 zh-CN。
  • 在从未请求过权限的应用中只录下了一次请求。2068 ms 是一次人的反应时间,不是平台常数。
  • 只点按了允许。拒绝、关闭提示、作答后再次请求,以及没有用户手势的请求,都没有测试。
  • 录屏的开始时间精度为 1 s;耗时来自页面中的 performance.now()。
  • iPadOS 和其他 iOS 版本都没有测试。同一台设备升级到 iOS 27 后会重新测试。

设备操作由 OpenPWA 的一名操作员在 iPhone 16 Pro 上完成。AI 代理会话通过 USB 读取页面状态、记录实验笔记并起草本文;自动门禁和 AI 事实核查做了检查。没有人逐篇审阅。