DEV Community

WAVX solutions
WAVX solutions

Posted on Originally published at wavxsolutions.in

PWAs on iPhone: What Works and What Does Not (October 2026)

As of October 2026, per the sources below, a progressive web app on iPhone can be added to the Home Screen, open in its own window without browser controls, work offline through a service worker, send push notifications and show a badge on its icon. It cannot show an automatic install prompt, sync data in the background, or reach Bluetooth, NFC or USB devices. Push notifications work only after the user has added the app to the Home Screen.

How this page was compiled. Every row below comes from WebKit's release posts, Apple's developer documentation or MDN's browser compatibility data, all read on 2 October 2026. Safari 27, which ships with iOS 27, was released in September 2026 and is the current version. This is a reading of documentation, not a device test. A checklist for confirming the items that matter to your product is at the end.

Support table: installing and launching

Capability On iPhone Since Notes
Add to Home Screen from Safari Works Long-standing From iOS 26, every site added to the Home Screen opens as a web app by default. The user can switch off "Open as Web App".
Add to Home Screen from Chrome, Edge, Firefox Works iOS 16.4 Through the Share menu of those browsers
Automatic install prompt (beforeinstallprompt) Not supported The event exists only in Chromium browsers
Own window (display: standalone) Works iOS 11.3 MDN's data lists fullscreen and minimal-ui as unsupported in Safari
Icons from the manifest Works iOS 15.4 Used only when the page has no apple-touch-icon and the icon's purpose is any or unset
Manifest id Works iOS 16.4 Lets the same app be installed more than once
Manifest shortcuts Not supported Listed for Safari on Mac from 17.4, not for iOS

Support table: offline, storage and background work

Capability On iPhone Since Notes
Service worker and Cache API Works iOS 11.3 The basis of offline support
Storage quota Around 60% of disk per origin iOS 17 A Home Screen web app has the same quota as the site in the browser
Persistent storage request Works iOS 15.2 Safari decides using heuristics, including whether the site is opened as a Home Screen web app
Navigation preload Works iOS 15.4
Service worker static routing Works iOS 27 New in Safari 27
Background Sync Not supported
Periodic Background Sync Not supported
Background Fetch Not supported

Support table: notifications

Capability On iPhone Since Notes
Web Push Works, with conditions iOS 16.4 Home Screen web apps only; permission must follow a tap; every push must show a notification
Declarative Web Push Works iOS 18.4 Home Screen web apps; no service worker needed to display the notification
Badge on the app icon (Badging API) Works iOS 16.4 Home Screen web apps only
Focus modes Works iOS 16.4 Web app notifications follow the user's Focus settings
Action buttons, image and vibration pattern on a notification Not supported MDN's data lists these notification options as unsupported in Safari

Support table: device features

Capability On iPhone Since Notes
Camera and microphone (navigator.mediaDevices) Works iOS 11
Geolocation Works Long-standing
Web Share Works iOS 12.2
Screen Wake Lock Works iOS 16.4 in Safari, iOS 18.4 in Home Screen web apps Did not work in Home Screen web apps before 18.4
Web Bluetooth Not supported
Web NFC Not supported
WebUSB Not supported
Vibration API Not supported
Contact Picker Off by default Behind a preference flag from iOS 14.5
Detect an installed native app (getInstalledRelatedApps) Not supported

Installing: there is no prompt, so explain it

On Android, Chrome fires beforeinstallprompt and a site can show its own install button. Safari does not support that event, and MDN's installability guide states plainly that it is not supported on iOS. On iPhone the user installs by hand:

  1. Open the Share menu in the browser.
  2. Tap Add to Home Screen.
  3. Confirm the name and tap Add.

WebKit's notes for Safari 26 describe what changed last year. Before iOS 26, a site opened as a web app only if it had a manifest with a suitable display value or the older Apple meta tag; otherwise the Home Screen icon opened a browser tab. From iOS 26, every site added to the Home Screen opens as a web app by default, and WebKit describes this as zero requirements for installability in Safari.

Keep the manifest anyway. It still sets the name, icon and start address, and visitors on older iOS versions need "display": "standalone" to get the app window at all.

Since most people do not know the Share menu route, show a hint to iPhone visitors who have not installed yet:

<p id="ios-install-hint" hidden>
  To install this app: tap the Share button, then "Add to Home Screen".
</p>
<script>
  const isIPhone = /iPhone/.test(navigator.userAgent);
  const isInstalled = window.matchMedia("(display-mode: standalone)").matches;
  if (isIPhone && !isInstalled) {
    document.querySelector("#ios-install-hint").hidden = false;
  }
</script>
Enter fullscreen mode Exit fullscreen mode

If install is not working at all, the checks are in PWA not installing.

Push notifications on iPhone: the exact conditions

Web Push arrived on iPhone in iOS 16.4. It uses the same standards as other browsers: the Push API, the Notifications API and a service worker. The conditions are what catch people out.

  • The app must be on the Home Screen. MDN's data notes that on iOS the Notification interface is undefined unless the page is a web app saved to the Home Screen. In a Safari tab there is nothing to call.
  • Permission must follow a tap. Apple's documentation says to give the user a control such as a button and to call the subscription method immediately from that gesture's event handler.
  • Every push must be shown. Apple states that Safari does not support invisible push notifications, and that if you do not present a notification Safari revokes the push permission for your site.
  • No developer account is needed. Apple's documentation says you do not need to join the Apple Developer Program to send web push notifications.
  • Your server must reach Apple's push service. If outbound traffic is restricted, Apple says to allow https://*.push.apple.com.

Once granted, WebKit says these notifications behave like those from other apps: they show on the Lock Screen, in Notification Center and on a paired Apple Watch.

The subscription code is the same as for any browser. The service worker registration is fetched before the click so that subscribe() runs directly inside the tap handler.

// Page script (type="module"). VAPID_PUBLIC_KEY is your server's public key.
function urlBase64ToUint8Array(base64String) {
  const padding = "=".repeat((4 - (base64String.length % 4)) % 4);
  const base64 = (base64String + padding).replace(/-/g, "+").replace(/_/g, "/");
  return Uint8Array.from(atob(base64), (char) => char.charCodeAt(0));
}

const button = document.querySelector("#enable-alerts");
const pushSupported = "Notification" in window && "PushManager" in window;

if (!pushSupported) {
  // On iPhone this is the case in a Safari tab. Ask the user to install first.
  button.hidden = true;
} else {
  const registration = await navigator.serviceWorker.ready;
  button.addEventListener("click", async () => {
    try {
      const subscription = await registration.pushManager.subscribe({
        userVisibleOnly: true,
        applicationServerKey: urlBase64ToUint8Array(VAPID_PUBLIC_KEY),
      });
      await fetch("/api/push/subscribe", {
        method: "POST",
        headers: { "Content-Type": "application/json" },
        body: JSON.stringify(subscription),
      });
    } catch (error) {
      console.error("Push subscription failed:", error);
    }
  });
}
Enter fullscreen mode Exit fullscreen mode

Declarative Web Push, from iOS 18.4

WebKit added Declarative Web Push in iOS 18.4 for web apps on the Home Screen. The push message itself is a JSON description of the notification, and the browser displays it without running any JavaScript. The format in WebKit's announcement looks like this:

{
  "web_push": 8030,
  "notification": {
    "title": "Your order has shipped",
    "body": "Tap to see tracking details.",
    "navigate": "https://www.example.com/orders/1042",
    "silent": false,
    "app_badge": "1"
  }
}
Enter fullscreen mode Exit fullscreen mode

WebKit designed it to be backwards compatible: a browser that understands the format handles it itself, and an older browser passes the same message to your service worker. A push handler that reads the same shape covers both:

// In sw.js
self.addEventListener("push", (event) => {
  const payload = event.data ? event.data.json() : {};
  const note = payload.notification || {};
  event.waitUntil(
    self.registration.showNotification(note.title || "Update", {
      body: note.body || "",
      data: { url: note.navigate || "/" },
    })
  );
});

self.addEventListener("notificationclick", (event) => {
  event.notification.close();
  event.waitUntil(clients.openWindow(event.notification.data.url));
});
Enter fullscreen mode Exit fullscreen mode

Offline and storage on iPhone

Service workers have been in Safari on iOS since 11.3, so the caching rules in service workers and caching strategies apply. Three iPhone-specific points:

Quota is generous, eviction is the risk. WebKit's storage policy, in force from iOS 17, allows an origin up to around 60% of total disk in a browser app, and a Home Screen web app gets the same. WebKit may still evict data when the overall quota is exceeded, when the device is under storage pressure, or when the user has not interacted with the site for some time.

The seven-day rule is aimed at browser tabs. Safari deletes a site's script-writable storage, including service worker registrations and caches, after seven days of Safari use without interaction on that site. WebKit's post introducing the rule says web apps added to the Home Screen have their own counter based on actual use of the app, and that it does not expect their first-party data to be deleted.

An installed app has its own storage. web.dev's installation guide says each installation on Apple devices has isolated storage. Plan for a visitor who was signed in on your site in Safari to sign in again inside the installed app.

Because Background Sync is not available, anything queued offline has to be sent while the app is open. Detect the feature and fall back:

// Page script (type="module"). flushOutbox() sends whatever is queued.
const registration = await navigator.serviceWorker.ready;

if ("sync" in registration) {
  await registration.sync.register("send-outbox");
} else {
  // iPhone: retry when the app is open and the connection returns.
  window.addEventListener("online", flushOutbox);
  if (navigator.onLine) flushOutbox();
}
Enter fullscreen mode Exit fullscreen mode

What the gaps rule out

If your product needs On iPhone as a PWA
Uploads or sync that finish after the app is closed Not possible. Work completes only while the app is open.
Bluetooth devices, NFC tags or USB hardware Not possible. This needs a native app.
A one-tap install button Not possible. The user must use the Share menu.
Notification buttons such as "Reply" or "Mark done" Not available. A tap can only open the app.
A listing people can find in the App Store A PWA is not listed there. This needs a native app.
Content, catalogue, booking, ordering, account pages Works.
Offline reading of pages already visited Works.
Order and reminder notifications for installed users Works, from iOS 16.4.

How iPhone support has changed

iOS version What arrived
11.3 Service workers; display: standalone from the manifest
12.2 Web Share
15.4 Manifest icons; navigation preload
16.4 Web Push, Badging API, Add to Home Screen from third-party browsers, manifest id, Screen Wake Lock in Safari
17 New storage quotas; Add to Home Screen from in-app Safari views
18.4 Declarative Web Push; Screen Wake Lock inside Home Screen web apps
26 Every site added to the Home Screen opens as a web app by default
27 Service worker static routing API

Support has moved in one direction since 2023, but the missing items in the tables above have stayed missing through several releases. Plan around what exists today.

PWA or native app for iPhone users

Start with how many of your users this affects. Statcounter puts iOS at 6.05% of mobile web usage in India in September 2026, against 93.89% for Android. For a product aimed at the Indian mass market, the iPhone gaps touch a small share of users. For a premium, urban or export audience the share can be far higher, so check your own analytics before deciding.

A PWA is usually enough on iPhone when the product is content, commerce, booking or an internal tool, and when notifications are useful but not critical. WavX builds these under PWA development.

A native app is the better choice when the product depends on background work, hardware over Bluetooth or NFC, App Store discovery, or notifications that must reach every user and not only those who installed from the Share menu. That is mobile app development, and it costs more to build and maintain.

Many products do both in sequence: a PWA first, a native app later if usage justifies it. The broader comparison is in PWA vs native app and website vs app vs PWA. If you already have a site, turning it into a PWA is the smaller first step. The full set of PWA guides is on the PWA development hub.

Check it on your own devices

Documentation and behaviour can differ, and iOS changes several times a year. Before you commit to a plan, run these on a real iPhone and write down the iOS version and the date:

  1. Add the site to the Home Screen from Safari and from one other browser. Does it open in its own window with the right name and icon?
  2. Turn on aeroplane mode and open it. Does the offline page or cached content appear?
  3. Subscribe to push from inside the installed app, lock the phone and send a test message.
  4. Set and clear the icon badge.
  5. Sign in, close the app, wait a week and open it again. Are you still signed in?
  6. Repeat on the oldest iOS version you intend to support.

Sources

Top comments (0)