Push notification deep links on iOS
The link in a push payload takes a different path through your app than a link tapped in a browser, and the difference is where most of the bugs live.
6 August 2026 by PAD team
Where the URL goes
A push payload is JSON, and any deep link inside it is a value your own code reads. iOS does not route it for you the way it routes a universal link tapped in Safari:
{
"aps": { "alert": "Your order shipped" },
"url": "myapp://orders/42"
}
That means the handling is entirely yours, and it has to work in two very different situations.
Cold start versus warm start
If the app is already running, the notification arrives in the delegate and you navigate immediately. If the app is not running, it launches first, and the payload arrives before your navigation stack exists.
The classic bug is navigating too early on a cold start, which either crashes or silently does nothing because the destination screen has no parent yet. Store the pending destination and act on it once the interface is ready.
Why universal links behave differently here
A universal link in a push payload does not get verified by iOS the way it does when tapped in Safari. Your code receives a string and decides what to do with it. If you pass it to the system, you may end up bouncing out to the browser and back, which looks broken to the user.
Parse the URL yourself and route internally. Reserve the system hand-off for links arriving from outside your app.
The store link case
A push that points at the App Store, usually for a companion app or an update, has the same fragility as anywhere else: if it ends up rendered in a WebView rather than handed to the store, it dies on a blank page. That is the same mechanism as in social apps.
Testing
- Test cold start by force quitting the app before sending
- Test with the app backgrounded, which is a third path in some frameworks
- Test on a real device, since simulators handle push differently or not at all
- Send yourself a payload with an intentionally malformed URL and confirm nothing crashes
For the store link case in any channel, one address that survives whichever browser opens it.