RORK LABJP
NATIVE — Rork Max reaches AR and LiDAR scanning, Metal-backed 3D, Dynamic Island, Siri Intents, HealthKit, NFC, App Clips, and on-device Core MLIOS27 — iOS 27 Developer Beta 4 extends Siri AI to iPhone 15 Pro and 15 Pro Max plus the 16 and 17 lines, with noticeably faster responses than the first betaDESIGN — Apple's own design kits for iOS, iPadOS, and macOS 27 are now available for Figma and Sketch, ready for when you lay out UI for the new OSCANARY — Android 17, codenamed Cinnamon Bun, retires Developer Previews in favor of continuously updated Canary builds, which changes when you schedule testingSPARK — Gemini Spark in Android 17 drives apps directly to automate multi-step errands like booking a ride or placing an orderSCALE — Rork raised $2.8M from a16z and now draws roughly 743,000 visits a monthNATIVE — Rork Max reaches AR and LiDAR scanning, Metal-backed 3D, Dynamic Island, Siri Intents, HealthKit, NFC, App Clips, and on-device Core MLIOS27 — iOS 27 Developer Beta 4 extends Siri AI to iPhone 15 Pro and 15 Pro Max plus the 16 and 17 lines, with noticeably faster responses than the first betaDESIGN — Apple's own design kits for iOS, iPadOS, and macOS 27 are now available for Figma and Sketch, ready for when you lay out UI for the new OSCANARY — Android 17, codenamed Cinnamon Bun, retires Developer Previews in favor of continuously updated Canary builds, which changes when you schedule testingSPARK — Gemini Spark in Android 17 drives apps directly to automate multi-step errands like booking a ride or placing an orderSCALE — Rork raised $2.8M from a16z and now draws roughly 743,000 visits a month
Articles/Dev Tools
Dev Tools/2026-06-21Advanced

Your Notification Opens the App but Lands on Home — Routing Rork Apps by Launch State

How to make a notification tap reliably reach its target screen. We cover the three launch states — killed, background, foreground — and a pending-route design that never drops a tap that arrives before navigation is ready.

Rork526Expo157Notifications3Deep Linking6Routing

Premium Article

On one app I run, I once sent a "your order has shipped" push notification from the server. Tapping it launched the app — but it just sat on the home screen and never opened the order detail. It worked perfectly on my test device, so the cause took a while to pin down.

The short version: when the app launched from a fully killed state via the tap, my navigation command fired before the navigator was mounted. The command was quietly ignored, with no error.

Almost every notification-routing headache comes down to this one gap: the moment of the tap versus the moment a screen can actually be drawn. Let me walk through a design that absorbs that gap, organized by launch state.

The three launch states you have to account for

When the user taps a notification, the way you receive that tap depends entirely on what state the app was in. Conflate these and you end up with code that only works in one of them.

Launch stateApp conditionWhere the tap comes from
killed (cold start)Process was terminatedgetLastNotificationResponseAsync()
backgroundSuspended in the backgroundResponse listener
foregroundVisible on screenResponse listener

A cold start is the tricky one: the tap that launched the app may never reach your listener. By the time the app boots and registers the listener, that event has already passed. That is exactly why you need to fetch the "last response" once at startup.

In the background and foreground states the app is already alive, so the listener fires reliably.

Put the routing info in the notification's data

What decides the destination is not the notification body — it's the data payload. Send a structured destination on every notification from the server.

// Notification payload the server sends (example)
{
  "to": "ExponentPushToken[xxxxxxxx]",
  "title": "Shipping update",
  "body": "Your order is on its way",
  "data": {
    "type": "order",
    "id": "A-10293"
  }
}

Structuring it as type and id makes it far easier to validate when you reassemble the route later. You could also drop a fully formed URL string into data, but using a server-supplied string directly as a destination is something I'd rather avoid — I'll explain why toward the end.

Thank you for reading this far.

Continue Reading

What follows includes implementation code, benchmarks, and practical content we hope you'll find useful. This site runs without ads — server and development costs are supported entirely by members like you. If it's been helpful, we'd be truly grateful for your support.

WHAT YOU'LL LEARN
A pending-route design that absorbs the gap between the moment of the tap and the moment a screen can render
An implementation that reliably catches notification taps across all three launch states: killed, background, and foreground
How to wire an allowlist and a safe fallback so you never push the user to an unvalidated route
Secure payment via Stripe · Cancel anytime

Unlock This Article

Get full access to the rest of this article. Buy once, read anytime. This site is ad-free — your support goes directly toward keeping it running.

or
Unlock all articles with Membership →
Share

Thank You for Reading

Rork Lab is ad-free, supported entirely by members like you. We publish practical guides daily with implementation code, benchmarks, and production-ready patterns. If you've found it useful, we'd love to have you on board.

  • Copy-paste ready implementation code
  • New advanced guides published daily
  • $5/mo or $10 for lifetime access
View Membership →

Related Articles

Dev Tools2026-07-07
The App Icon Badge Still Says 3 — Rebuilding Expo Badge Counts Around a Single Source of Truth
Why an Expo app's icon badge drifts out of sync with real unread counts and refuses to clear — and how to rebuild it around a single source of truth, with working recompute-and-sync code and the production pitfalls that bite you.
Dev Tools2026-06-16
Notifications You Can Finish Without Opening the App — Interactive Notification Actions for Rork Apps
Those buttons and text fields that appear when you long-press a notification. Here is how to implement interactive notification actions in a Rork-built Expo app for an experience that completes without launching, including the background-execution pitfalls.
Dev Tools2026-08-02
When Two-Character Queries Silently Return Nothing: Measuring Japanese Search Indexes in an Expo App
SQLite FTS5's trigram tokenizer returns zero rows for Japanese queries shorter than three characters, without raising anything. I benchmarked linear scan, a bigram inverted index, and FTS5 over a 20,000-item catalog to find the real threshold.
📚RECOMMENDED BOOKS
Build a Large Language Model (From Scratch)
Sebastian Raschka
LLM Dev
Prompt Engineering for LLMs
Berryman & Ziegler
Prompting
AI Engineering
Chip Huyen
AI Eng
* Contains affiliate links
See all →