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-07-13上級

WebViewのpostMessageは投げたら終わり — 相関IDで要求と応答を結ぶブリッジを設計する

WebView と React Native の postMessage は片道通信で、送った処理が成功したのか分かりません。相関IDと応答を組み込んだ要求・応答型ブリッジを、動く TypeScript コードで設計します。

WebView2React Native203Rork503ブリッジTypeScript8

プレミアム記事

送ったはずの保存が、本当に終わったのか分からなかった

Rork で作った個人開発アプリに、既存の Web 版マークダウンエディタを WebView で埋め込んだときのことです。ネイティブ側の「保存」ボタンを押すと、injectedJavaScript でエディタの本文を取り出して自前のバックエンドへ送る。その設計自体は数十分で動きました。

問題は、保存ボタンを押した直後にユーザーが画面を閉じたときでした。本文がまだ取り出せていないのに保存完了のトーストが出る。逆に、通信が遅い端末では二重送信が起きる。原因を追ううちに、根っこは一つだと気づきました。window.ReactNativeWebView.postMessage は投げたら終わりの片道通信で、送った処理が成功したのかを知る仕組みが最初から無いのです。

ここでは、この片道性を埋めるために私が組んだ要求・応答型のブリッジを共有します。相関IDで送信と応答を結びつけ、ネイティブ側からは await bridge.call(...) と書けるようにする設計です。

postMessage が「投げたら終わり」である理由

React Native の WebView 通信は、双方向に見えて実際には独立した二本の片道パイプです。ネイティブから Web へは injectedJavaScript あるいは webviewRef.injectJavaScript() で JavaScript 文字列を流し込む。Web からネイティブへは window.ReactNativeWebView.postMessage(string) を呼び、ネイティブ側の onMessage で受け取る。

この二本には、要求と応答を紐づける仕組みがありません。ネイティブが「本文をくれ」と流し込んだ JavaScript の実行結果が、あとから onMessage に届いたメッセージのどれに対応するのか、フレームワークは教えてくれないのです。メッセージが一種類だけなら気になりません。ところが保存・取得・検証・スクロール位置の問い合わせと種類が増えると、届いた文字列がどの要求への返事なのか判別できず、状態が混線します。

HTTP のリクエストとレスポンスが対応づくのは、TCP コネクションや HTTP/2 のストリームIDが両者を結んでいるからです。postMessage にはそれが無い。ならば、自分で相関IDを持たせればよい。これが設計の出発点でした。

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

この記事の続きを読む

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

この記事で得られること
postMessage の片道性を相関IDで補い、Promise で待てる呼び出しに変える設計
タイムアウト5秒・アンマウント・リロードで宙に浮く要求を漏れなく片付ける実装
オリジン検証と型ホワイトリストで、埋め込んだ Web を信頼しすぎない防御
Stripe による安全な決済 · いつでもキャンセル可能

この記事を購入する

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

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

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

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

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

関連記事

開発ツール2026-04-28
Rork が生成したコードの TypeScript 型エラーが消えない時に試す5つの修正パターン
Rork が出力した React Native コードで TypeScript の型エラーが何度修正しても消えない時に、まず疑うべき5つのパターンと具体的な書き換え方を、実例とともにまとめました。
開発ツール2026-04-24
Rork アプリの WebView が真っ白になる・ページが表示されないときに確認する 6 つの原因
Rork で WebView を組み込んだら画面が真っ白になる、ページが読み込まれない、JavaScript が動かない ─ そんな症状を切り分けて確実に直すためのチェックリストです。
開発ツール2026-07-11
Sentry のイベント枠を数日で使い切ったとき — 送る前にノイズを削って本当のエラーを残す運用メモ
Sentry のイベント枠が月初で尽きる原因はノイズの偏りです。beforeSend・サンプリング・グルーピングで送信前に量を絞り、重要なエラーだけを枠内に残す実装と、実際に送信量を測って立て直した運用手順をまとめました。
📚RECOMMENDED BOOKS
大規模言語モデル入門
山田育矢
LLM開発
生成AIプロンプトエンジニアリング入門
我妻幸長
プロンプト
Claude CodeによるAI駆動開発入門
平川知秀
AI駆動開発
※ アフィリエイトリンクを含みます
もっと見る →