Sending Push Notifications to iOS from PWA
Master System Design with Codemia
Enhance your system design skills with over 120 practice problems, detailed solutions, and hands-on exercises.
Introduction
Sending push notifications to an iOS Progressive Web App is possible today, but only under specific conditions. The important shift is that iOS supports standards-based Web Push for Home Screen web apps, not generic push for any page open in Safari. That means the PWA must be installable, launched from the Home Screen, and registered with a service worker before push permissions and subscriptions make sense.
What iOS Actually Supports
On modern iOS versions, Web Push support is tied to Home Screen web apps. In practice, that means:
- the site must be served over HTTPS
- the app must include a web manifest
- the app must be added to the Home Screen
- the user must open the installed web app and grant notification permission there
- a service worker must handle push events
This is not the same as shipping an APNs-enabled native app. The browser-facing APIs are still the Push API, Notifications API, and service workers.
The Overall Flow
A normal implementation has four parts:
- the PWA registers a service worker
- the installed web app requests notification permission
- the app creates a
PushSubscriptionand sends it to your backend - your backend sends Web Push messages to that subscription endpoint
The browser and Apple infrastructure handle the delivery path behind the scenes. Your server does not talk to APNs using the native-app provider API for this workflow.
Register the Service Worker
The service worker handles incoming push events and notification clicks.
Example sw.js:
Ask for Permission and Create a Subscription
Permission should be requested only in a user-initiated flow, such as tapping an "Enable notifications" button.
The backend stores the subscription and later uses it to send notifications.
Server-Side Sending
A common Node.js backend uses the web-push package.
This is standard Web Push server behavior. The subscription endpoint tells the push service where to route the notification.
iOS-Specific Caveats
The most important caveat is that notification support is tied to the installed Home Screen app experience. If you test only in a normal Safari tab, you may conclude push does not work even though the actual PWA path is correct.
Also keep expectations realistic:
- not all legacy iOS versions support this
- the user must explicitly grant permission
- background behavior is still subject to platform rules and power management
So the right test path is always the installed PWA, not just the website in a tab.
Common Pitfalls
The most common mistake is trying to request push permission from a normal Safari tab and expecting Home Screen web app behavior.
Another mistake is assuming you need the native APNs provider API. For PWA web push, the browser-facing flow is standards-based Web Push with service workers and push subscriptions.
Developers also often forget that permission prompts should be triggered by a user action. Calling them arbitrarily on page load is poor UX and often ineffective.
Finally, do not skip manifest and service-worker setup. Without an installable PWA foundation, iOS push support is not the feature set you think you are targeting.
Summary
- iOS PWA push works through standards-based Web Push for Home Screen web apps.
- The PWA must be installable, served over HTTPS, and registered with a service worker.
- Permission and subscription should happen from the installed PWA, not just a Safari tab.
- Your backend sends notifications using the stored
PushSubscriptionand Web Push protocol. - Test the actual installed PWA flow, because that is where iOS support applies.

