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

> iOS 18.6.2 上，在从未请求过权限的主屏应用中点按触发 Notification.requestPermission()，请求挂起 2068 ms 直到用户回应。

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="notification-permission-prompt" locale="zh" />

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

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

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

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

## 全新权限状态与请求计时

我们为这一步单独安装了「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. 把耗时与录屏中的提示对照。如果有了结果、屏幕上却没出现过提示，说明请求未经用户作答就已结束。

<LabHarnessLinks behaviour="notification-permission-prompt" locale="zh" />

## 结果

在 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）。

<LabResults behaviour="notification-permission-prompt" locale="zh" />

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

## 权限请求条件与 Promise 结果

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

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

## 数据

这些值在研究的[数据包](/zh/research/2026-10-ios18-home-screen-web-apps/data/)中（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](/lab/results.json) 中，id 为 `notification-permission-prompt/2026-10-20-ios-18.6.2-22g100`。

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

## 相关参考条目

这一结果支撑 [iOS 与 iPadOS 上的 Web Push](/zh/reference/notifications/ios-safari-push/) 中关于权限的段落、[Notification.requestPermission()](/zh/reference/notifications/permissions/) 的 iOS 备注，以及通知权限兼容性数据中 iOS 版 Safari 一行。

<LabBacks behaviour="notification-permission-prompt" locale="zh" />

## 局限

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

<LabProvenance locale="zh" />