RORK LABEN
DEADLINE — Google Play の Android 16(API レベル36)必須化まで残り4日です。8月31日以降、新規アプリも既存アプリの更新も対象となりますRULES — 提出ルールと可視性ルールは別物です。更新を止めているアプリも、API 35 未満のままだと新しい端末で新規ユーザーに表示されなくなりますEXTENSION — 延長を申請すれば11月1日まで全ユーザーへの配信を続けられます。フォームは Play Console から出るため、締切前に済ませておく必要がありますEXPO — Expo SDK 57 は React Native を 0.85 から 0.86 へ引き上げ、React は 19.2 で据え置きです。0.86 は破壊的変更がない想定とされていますHERMES — 57.0.9 が React Native 0.86.2 に更新し、SDK 56 の Hermes V1 メモリ退行を解消しました。reanimated や worklets を使うアプリで効きますPREBUILD — expo prebuild が native の android・ios ディレクトリを既定でクリアして再生成します。手を入れた native 変更は、事前に洗い出さないと静かに失われますDEADLINE — Google Play の Android 16(API レベル36)必須化まで残り4日です。8月31日以降、新規アプリも既存アプリの更新も対象となりますRULES — 提出ルールと可視性ルールは別物です。更新を止めているアプリも、API 35 未満のままだと新しい端末で新規ユーザーに表示されなくなりますEXTENSION — 延長を申請すれば11月1日まで全ユーザーへの配信を続けられます。フォームは Play Console から出るため、締切前に済ませておく必要がありますEXPO — Expo SDK 57 は React Native を 0.85 から 0.86 へ引き上げ、React は 19.2 で据え置きです。0.86 は破壊的変更がない想定とされていますHERMES — 57.0.9 が React Native 0.86.2 に更新し、SDK 56 の Hermes V1 メモリ退行を解消しました。reanimated や worklets を使うアプリで効きますPREBUILD — expo prebuild が native の android・ios ディレクトリを既定でクリアして再生成します。手を入れた native 変更は、事前に洗い出さないと静かに失われます
記事一覧/開発ツール
開発ツール/2026-07-13上級

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

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

WebView2React Native232Rork544ブリッジ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/月 または ¥2,480 の永久アクセス
メンバーシップを見る →

関連記事

開発ツール2026-04-28
Rork が生成したコードの TypeScript 型エラーが消えない時に試す5つの修正パターン
Rorkが出力したReact NativeコードでTypeScriptの型エラーが消えないときに疑う5つのパターンです。Propsの暗黙のany、useStateの型推論ミス、@typesの欠落、ナビゲーションparam型の食い違い、as anyのごまかしについて具体的な書き換え方を示します。
開発ツール2026-04-24
Rork アプリの WebView が真っ白になる・ページが表示されないときに確認する 6 つの原因
RorkアプリのWebViewが真っ白になる、ページが読み込まれないときに確認する6つの原因です。iOSのATS、AndroidのcleartextTraffic、リダイレクトとクッキーの無限ループ、プロセス外WebViewのクラッシュ、プレビューと本番の差まで切り分けて直します。
開発ツール2026-08-22
一括置換は全ファイル成功しました。壊れたのは、消さなかった行のほうです
生成コードに一括置換をかけると、一致した行ではなく隣の行が壊れます。運用中のプロジェクトで実際に起きた破損と、置換の不変条件を検査する20行のガードスクリプトをまとめました。
📚RECOMMENDED BOOKS
大規模言語モデル入門
山田育矢
LLM開発
生成AIプロンプトエンジニアリング入門
我妻幸長
プロンプト
Claude CodeによるAI駆動開発入門
平川知秀
AI駆動開発
※ アフィリエイトリンクを含みます
もっと見る →