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:
- Open the Share menu in the browser.
- Tap Add to Home Screen.
- 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>
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
Notificationinterface 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);
}
});
}
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"
}
}
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));
});
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();
}
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:
- 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?
- Turn on aeroplane mode and open it. Does the offline page or cached content appear?
- Subscribe to push from inside the installed app, lock the phone and send a test message.
- Set and clear the icon badge.
- Sign in, close the app, wait a week and open it again. Are you still signed in?
- Repeat on the oldest iOS version you intend to support.
Sources
- WebKit: Web Push for Web Apps on iOS and iPadOS, read 2 October 2026
- WebKit: WebKit Features in Safari 16.4, read 2 October 2026
- WebKit: WebKit Features in Safari 17.0, read 2 October 2026
- WebKit: Updates to Storage Policy, read 2 October 2026
- WebKit: Full Third-Party Cookie Blocking and More, read 2 October 2026
- WebKit: Meet Declarative Web Push, read 2 October 2026
- WebKit: WebKit Features in Safari 18.4, read 2 October 2026
- WebKit: News from WWDC25, WebKit in Safari 26 beta, read 2 October 2026
- WebKit: WebKit Features in Safari 26.0, read 2 October 2026
- WebKit: WebKit Features for Safari 27.0, read 2 October 2026
- Apple Developer Documentation: Sending web push notifications in web apps and browsers, read 2 October 2026
- MDN browser-compat-data, the data behind MDN's compatibility tables, read 2 October 2026
- MDN: Making PWAs installable, read 2 October 2026
- MDN: Window beforeinstallprompt event, read 2 October 2026
- MDN: Offline and background operation, read 2 October 2026
- web.dev: Learn PWA, Installation, read 2 October 2026
- Statcounter Global Stats: Mobile Operating System Market Share in India, read 2 October 2026
Top comments (0)