◉RORK LABEN
●GPT-6.1 SOL — Rork のモデルメニューに追加(09-29)。Low/Medium/High を選べ、Pro・Max に含まれます●SONNET 5.5 — UI づくりが得意で、Sonnet 5 より出力が速いモデルが選べます(09-28)●SONNET 4.5 — Claude API での提供終了は 11/30、残り27日。API 連携を足したアプリは移行先の確認を●SDK 58 — React Native 0.88 に更新されました。Android のリリース版で R8 が既定オンになり、iOS は SceneDelegate を生成します●OBSERVE — EAS Observe がネイティブクラッシュも記録します(SDK 57.0.21 以降・10/07)●NEW — 起動広告が、背面から戻った回にしか出ていませんでした。「前面に戻った」合図が、…●GPT-6.1 SOL — Rork のモデルメニューに追加(09-29)。Low/Medium/High を選べ、Pro・Max に含まれます●SONNET 5.5 — UI づくりが得意で、Sonnet 5 より出力が速いモデルが選べます(09-28)●SONNET 4.5 — Claude API での提供終了は 11/30、残り27日。API 連携を足したアプリは移行先の確認を●SDK 58 — React Native 0.88 に更新されました。Android のリリース版で R8 が既定オンになり、iOS は SceneDelegate を生成します●OBSERVE — EAS Observe がネイティブクラッシュも記録します(SDK 57.0.21 以降・10/07)●NEW — 起動広告が、背面から戻った回にしか出ていませんでした。「前面に戻った」合図が、…
記事一覧/開発ツール
⬡ 開発ツール/2026-06-21上級

通知をタップしたのに目的の画面に飛ばない——Rorkアプリのルーティングを起動状態ごとに設計する

通知タップでアプリが起動したとき、目的の画面まで確実に届ける設計。killed / background / foreground の3状態と、ナビゲーション準備前のタップを取りこぼさない pending route の実装を解説します。

Rork611Expo234通知4ディープリンク9ルーティング

✦ プレミアム記事

ある運用中のアプリで、サーバーから「注文が発送されました」というプッシュ通知を送ったときのことです。通知をタップすると、アプリは起動するのにホーム画面が表示されるだけで、肝心の注文詳細には飛んでくれません。手元の検証端末では問題なく動いていたので、原因の特定にしばらく時間がかかりました。

結論から申し上げますと、アプリが完全に終了した状態(killed)から通知タップで起動したとき、ナビゲーターがまだ準備できていないタイミングで遷移命令を出していたことが原因でした。命令は静かに無視され、エラーも出ません。

通知ルーティングのつまずきは、ほとんどがこの「タップした瞬間」と「画面を描ける瞬間」のズレに集約されます。今回は、その差を吸収する設計を、起動状態ごとに整理してご紹介します。

まず押さえるべき3つの起動状態

通知をタップしたとき、アプリがどの状態にあったかで、タップ情報の受け取り方がまったく違います。ここを混同すると、片方の状態でしか動かないコードになります。

起動状態アプリの状況タップ情報の取得元
killed(コールドスタート)プロセスが終了していたgetLastNotificationResponseAsync()
backgroundバックグラウンドに退避していたレスポンスリスナー
foreground表示中だったレスポンスリスナー

killed からの起動が厄介なのは、起動のきっかけになったタップがリスナーに届かないことがある点です。アプリが立ち上がってリスナーを登録する頃には、そのイベントはすでに過ぎ去っています。だからこそ、起動時に一度だけ「最後のレスポンス」を取りに行く必要があります。

逆に background / foreground では、アプリはすでに生きているのでリスナーが確実に発火します。

ルーティング情報は通知のdataに載せる

遷移先を決めるのは通知の本文ではなく、data ペイロードです。サーバーから送る通知に、行き先を構造化して載せておきます。

// サーバー側が送る通知ペイロード(例)
{
  "to": "ExponentPushToken[xxxxxxxx]",
  "title": "発送のお知らせ",
  "body": "ご注文の商品を発送しました",
  "data": {
    "type": "order",
    "id": "A-10293"
  }
}

type と id のように構造化しておくと、後でルートへ組み立て直すときに検証しやすくなります。data に完成済みのURL文字列を直接入れる方法もありますが、サーバーが送る文字列をそのまま遷移先に使うのは避けたいところです。理由は後半でご説明します。

✦

ここまでお読みいただきありがとうございます。

この記事の続きを読む

この先には、実装コードやベンチマーク結果など、実務でお役に立てる内容をご用意しています。このサイトは広告を掲載しておらず、サーバーや開発にかかる費用はメンバーの皆様のご支援で成り立っています。もしお役に立てていましたら、ご支援いただけますと大変ありがたいです。

この記事で得られること
✦通知をタップした瞬間と画面が描画できる瞬間のズレを pending route で吸収する設計
✦killed / background / foreground の3つの起動状態それぞれで通知タップを確実に拾う実装
✦未検証のルートへ飛ばさないための許可リストと安全なフォールバックの組み込み方
Stripe による安全な決済 · いつでもキャンセル可能
✦

この記事を購入する

この先の内容をすべてお読みいただけます。一度のご購入で、いつでも何度でもアクセスできます。このサイトは広告を掲載しておらず、皆さまのご支援がサーバー費用などの運営を支えています。

または
メンバーシップなら全記事が読み放題 →
シェア

お読みいただきありがとうございます

Rork Lab は広告なしで運営しており、サーバー費用などの運営コストはメンバーシップのご支援で賄っています。実装コード・ベンチマーク・本番設計パターンなど、実務でお役立ていただける記事を毎日更新しています。もし読んでよかったと感じていただけましたら、ぜひご覧ください。

  • ✦コピー&ペーストで使える実装コード付き
  • ✦毎日新しい上級ガイドを追加
  • ✦¥580/月 または ¥1,480 の永久アクセス
メンバーシップを見る →

関連記事

⬡ 開発ツール2026-10-30
開発ビルドでは動くのに、Release の iOS だけ起動直後に落ちる — scheme を外した app.json が原因の場合の確かめ方
expo-router のアプリで app.json に scheme がないと、Release の iOS だけ起動直後に落ちることがあります。Debug と Android が無事な理由、直し方の二択、scheme を外したい場合の考え方、提出前に見つける確認手順を書き残します。
⬡ 開発ツール2026-10-15
EXPO_PUBLIC_ の値が、開発では読めて本番だけ undefined になる書き方を、変換結果で見分けます
API の URL が開発中は読めるのに、ビルドした途端に undefined になる。原因は process.env の書き方でした。babel-preset-expo の変換結果を開発・本番で並べ、置き換わる書き方と残ってしまう書き方を表にしました。
⬡ 開発ツール2026-10-13
リリース前に、書き出した Expo バンドルの中から自分の鍵を探してみる
ソースに鍵がなくても、出来上がったアプリの中に鍵が残ることがあります。Expo SDK 57 で実際に expo export を実行し、バンドルの中身を grep と 60 行ほどの Node スクリプトで調べて、見つかる鍵と見つからない鍵の違いを確かめました。