Skip to content

Notification permission in iOS Home Screen apps

Published

BehaviourMeasured 2026-10-20, iPhone 16 Pro, iOS 18.6.2 (22G100)A, Instrumented readAgrees with WebKit

A Home Screen web app on iOS asks for notification permission with Notification.requestPermission(). In the recorded request on 2026-10-20, an iPhone 16 Pro running iOS 18.6.2 (22G100) showed the system prompt and kept the promise pending for 2068 ms until the user answered.

In an iOS Home Screen web app that has not yet requested notification permission, does Notification.requestPermission() called from a tap show the system prompt, and does the promise stay pending until the user answers it?

The main test app is “Perm Test”, a separate harness app at /lab/device-tests/t7/perm/ with its own manifest, scope and service worker, installed for this step and not asked for permission before it. Its page prints three permission values and keeps a log of every request:

  • Notification.permission;
  • registration.pushManager.permissionState({userVisibleOnly: true}) on the app’s registration;
  • window.pushManager.permissionState({userVisibleOnly: true}), the Declarative Web Push manager;
  • for each request: the wall-clock start and end (Date.now()), the elapsed time measured with performance.now(), and the resolved value.

The values were read over USB before the tap (notebook N53) and after the answer (N54), and the operator recorded the screen during the request (N59). Two other contexts give supporting values: the “PWA Lab” app, where the operator’s screenshot shows the prompt (N58), and a plain Safari tab, where the interfaces were checked for presence (N03, N10). The demo app’s prompt (N41) rests on the operator’s report and is not used here.

The test needs an app that has not asked for permission yet. Whether deleting and re-adding an app resets its permission was not tested, so use a fresh install.

  1. Start a screen recording from Control Centre.
  2. In Safari, open https://openpwa.net/lab/device-tests/t7/perm/, tap Share, then Add to Home Screen, then Add. Launch Perm Test from its yellow P7 icon.
  3. Tap 1. Read state (no request). A never-prompted app shows default and prompt twice.
  4. Tap 2. Request permission. Note whether a system prompt appears and its exact text, then answer it.
  5. Stop the recording. Read “Last request (start / end / elapsed / result)” on the page and tap 1. Read state (no request) again.
  6. Compare the elapsed time with the prompt in the recording. A result with no prompt on screen would mean the request was decided without asking.

On iOS 18.6.2 (22G100) the never-prompted Perm Test app read default with both permissionState values prompt before the tap (Instrumented read, A; N53). The request started at 09:27:59.551 UTC, settled at 09:28:01.620 UTC and took 2068 ms, resolving "granted"; all three values then read granted (A; N54). The recording shows the system prompt from about 70.6 s to 72.5 s of the original file (about 69.6 s to 71.5 s in the published file, which drops the first 1.0 s), aligned with the page’s start and end times within the recording’s 1 s timestamp resolution (Screenshot or recording, S; N59). In a zh-CN interface it read ““Perm Test”想给你发送通知”, with the body “通知可能包括提醒、声音和图标标记。可在“设置”中配置相关功能。” and the buttons “不允许” and “允许”. Within that resolution the prompt was on screen during the interval the page recorded, so the request stayed pending until the prompt was answered.

The PWA Lab app shows the same prompt with its own name in a screenshot taken at 08:17:36 UTC (S; N58), and its permission read default at first launch and granted after the tap (A; N18, N32). In both apps one grant set the registration’s and window.pushManager’s permissionState to granted (A; N32, N54). Settings → 通知 then listed PWA Lab and the OpenPWA demo app with banners, sounds and badges (S; N61). In a Safari tab Notification and PushManager were absent, so no request is possible there (A; N03, N10).

2026-10-20, iOS 18.6.2

In Perm Test, a Home Screen app that had never prompted, the system prompt appeared after a tap and Notification.requestPermission() stayed pending until the answer: 2068 ms, ending in granted. The prompt is on the screen recording.

Date
2026-10-20
Device
iPhone 16 Pro
OS and build
iOS 18.6.2 (22G100), release
Context
Home Screen app
Result
As expected
Key values
  • stateBefore: default
  • promptAfterTap: true
  • requestPermissionPendingMs: 2068
  • result: granted
Confidence
A, Instrumented read
Tests
T7
Notebook entries
N53, N54, N58, N59
Study
Read the study · Data package
Harness
Harness v1
Harness v1 files used (3), served SHA-256
  • /lab/device-tests/t7/perm/ b7240ef04a15035c88668ad1c24333f47ffc005e22d4d51af6d4d1fb88ef3eeb
  • /lab/device-tests/t7/perm/manifest.webmanifest e667b5f34c2c41f658a172b930c955a8544118c2b99952b01df51c64973fb4b0
  • /lab/device-tests/t7/perm/sw.js 6a22bfccf256d296281167088a45904d36acbf590075b7eede5efa89bb9013dd

Permission requirements and promise resolution

Section titled “Permission requirements and promise resolution”

WebKit’s iOS 16.4 post requires the permission request in a Home Screen web app to follow a user gesture (Web Push for Web Apps on iOS and iPadOS, webkit.org). The Notifications API Standard defines requestPermission() as returning a promise that resolves with the permission once it is decided (Notifications API, whatwg.org). BCD records api.Notification on Safari for iOS from 16.4 as partial, with notes that the interface exists only in web apps saved to the Home Screen (Notification.json, github.com). The measurement agrees with all three. It records the prompt text in one UI language, the pending interval, and the fact that one grant set both push managers’ permissionState, which none of the three sources states (the permissionState() method itself is defined in the Push API, w3.org). It is not a new finding.

The coordinator’s relay that a prompt was shown at step 19 paraphrased the planned step and is void as evidence (N32-b). The operator later reported that no prompt appeared at step 19, but their own screenshot contradicts that report (N32-a, N58). Do not cite either account. Nothing in this run shows iOS granting permission without a prompt.

The values are in the study’s data package (CC BY 4.0): raw/2026-10-20-ios18.6.2-25c-pre-app-perm.json (N53) and raw/2026-10-20-ios18.6.2-25c-post-app-perm.json (N54), each with a .meta.json sidecar, and raw/2026-10-20-ios18.6.2-step19-app-lab-perm.json (N32) for PWA Lab. The recording is recording/2026-10-20_iphone16pro_ios18.6.2_T7_25c_trimmed.mp4, with key frames before, during (…_frame_t071.5s_prompt.png) and after the prompt; the PWA Lab prompt is screenshots/2026-10-20_iphone16pro_ios18.6.2_T7_2.png. The machine-readable run is in /lab/results.json under the id notification-permission-prompt/2026-10-20-ios-18.6.2-22g100.

The result backs the permission paragraph of Web Push on iOS and iPadOS, the iOS notes of Notification.requestPermission() and the Safari for iOS row of the notification permission compatibility data.

  • One device, one build, one operator, one run day: an iPhone 16 Pro on iOS 18.6.2 (22G100), with a zh-CN interface.
  • One recorded request in a never-prompted app. The 2068 ms is one human response time, not a platform constant.
  • Only Allow was tapped. A denial, a dismissed prompt, a second request after a decision, and a request made without a user gesture were not tested.
  • The recording’s start time has 1 s resolution; the interval comes from performance.now() in the page.
  • iPadOS and other iOS builds were not tested. The same device is due to be rerun after its upgrade to iOS 27.

Device steps performed by an OpenPWA operator on an iPhone 16 Pro. AI agent sessions read page state over USB, kept the notebook and drafted this text; automated gates and an AI fact-check checked it. No person reviews each entry.