RORK LABEN
MAX — Rork MaxはClaude CodeとClaude Opus 4.6を基盤に、React NativeではなくネイティブSwiftアプリを直接生成しますAPPLE — Rork MaxはiPhone・iPad・Apple Watch・Apple TV・Vision Pro・iMessageまでAppleエコシステム全体を対象にしますWORKFLOW — 実運用ではAIに足場を作らせ、状態管理とデータ層は自分で書き直す分担に落ち着いてきたという声が目立ちますSEED — 4月にLeft Lane Capital主導で$15Mのシードを調達しました(Peak XV・True Ventures・a16z Speedrunが参加)PAPERLINE — アプリビルダーPaperlineを買収。エンジニア人材の獲得へ今後も買収を続ける方針ですREVIEW — 3ヶ月使ったユーザーの再訪レビューが増え、得意・不得意と向く用途の見極めが進んでいますMAX — Rork MaxはClaude CodeとClaude Opus 4.6を基盤に、React NativeではなくネイティブSwiftアプリを直接生成しますAPPLE — Rork MaxはiPhone・iPad・Apple Watch・Apple TV・Vision Pro・iMessageまでAppleエコシステム全体を対象にしますWORKFLOW — 実運用ではAIに足場を作らせ、状態管理とデータ層は自分で書き直す分担に落ち着いてきたという声が目立ちますSEED — 4月にLeft Lane Capital主導で$15Mのシードを調達しました(Peak XV・True Ventures・a16z Speedrunが参加)PAPERLINE — アプリビルダーPaperlineを買収。エンジニア人材の獲得へ今後も買収を続ける方針ですREVIEW — 3ヶ月使ったユーザーの再訪レビューが増え、得意・不得意と向く用途の見極めが進んでいます
記事一覧/開発ツール
開発ツール/2026-06-21上級

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

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

Rork502Expo139通知4ディープリンク8ルーティング

プレミアム記事

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

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

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

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

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

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

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

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

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

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

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

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

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

この記事の続きを読む

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

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

この記事を購入する

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

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

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

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

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

関連記事

開発ツール2026-07-07
アイコンのバッジが「3」のまま消えない — Expoアプリのバッジ数をSource of Truthで作り直す
Expoアプリのアイコンバッジが実際の未読と食い違い、消えなくなる原因を突き止め、バッジ数を状態から再計算して同期するSource of Truth設計を、動くコードと実運用の落とし穴つきで整理します。
開発ツール2026-06-30
Rork アプリにホーム画面長押しのクイックアクションを足す — 動的項目とコールド起動の取りこぼしを防ぐ
アイコン長押しで出るクイックアクションを Rork(Expo)アプリに実装する設計です。静的・動的項目の使い分け、iOS と Android の差、そしてコールド起動でアクションがルーター準備前に届いて取りこぼす問題を、保留と再生で防ぐ実装手順までまとめます。
開発ツール2026-06-16
通知を「開かなくても片付く」ものにする — Rork アプリのインタラクティブ通知アクション設計
通知を長押しすると現れるボタンやテキスト入力。Rork で作った Expo アプリにこのインタラクティブ通知アクションを実装し、アプリを開かずに完了できる体験を設計します。バックグラウンド処理の落とし穴まで踏み込みます。
📚RECOMMENDED BOOKS
大規模言語モデル入門
山田育矢
LLM開発
生成AIプロンプトエンジニアリング入門
我妻幸長
プロンプト
Claude CodeによるAI駆動開発入門
平川知秀
AI駆動開発
※ アフィリエイトリンクを含みます
もっと見る →