Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Sign up for free
Menu
Search
Features
All features
Private URLs
Password Protection
Custom URLS
Scheduled publishing
Remove Branding
Restrict embedding
Deck Collections
Notes
Features
All features
Private URLs
Password Protection
Custom URLS
Scheduled publishing
Remove Branding
Restrict embedding
Deck Collections
Notes
Explore
Featured decks
Featured speakers
Programming
Technology
Storyboards
Explore
Featured decks
Featured speakers
Programming
Technology
Storyboards
Pricing
Search
Sign in
Sign up for free
React Native と WebView を堅実に連携させる
Search
cm-ayf
April 24, 2026
Programming
130
0
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
React Native と WebView を堅実に連携させる
cm-ayf
April 24, 2026
Other Decks in Programming
See All in Programming
標準パッケージに uuid が追加された 背景から見る Go らしい意思決定 / go_127_uuid_decision
convto
5
9.3k
Intent as Code
shoppingjaws
6
1.1k
ソニーのクラウド共通基盤の変遷とAI時代の開発スタイルに合わせた進化 / The Journey of Sony’s Common Cloud Platform and Its Evolution for AI-Native Development
kenjiyoneyama
0
210
半永久的に提供し続けられるプライベートクラウドを目指して ― 利用者の認知負荷を抑えるAPI抽象化とハードウェア世代交代の基盤設計
tomokon
0
380
GemmaをJevのように使ってみる / Use Gemma like Jev
kishida
5
480
Verilogで学ぶCPU自作入門.pdf
uyuki234
7
3.9k
C#の現在地 進化の歴史と、AI時代の.NET Everywhere
neuecc
5
4.8k
Augmenting AI with the Power of Jakarta EE
ivargrimstad
0
380
iOSDCのペンライトを自動制御したい!
akkeylab
0
330
[Rails World 2026] Durable orchestration on Rails: from continuation to workflow
palkan
1
410
大喜利で理解するLLM as a Judge / Understanding LLM-as-a-Judge through Ogiri
rockname
0
180
テストを司るデーモンに会いに行く 〜隔離した仮想マシンでテストを通すまで〜
h1d3mun3
1
600
Featured
See All Featured
Design and Strategy: How to Deal with People Who Don’t "Get" Design
morganepeng
133
20k
Google's AI Overviews - The New Search
badams
0
1.6k
How to optimise 3,500 product descriptions for ecommerce in one day using ChatGPT
katarinadahlin
PRO
3
3.8k
Mozcon NYC 2025: Stop Losing SEO Traffic
samtorres
1
570
Writing Fast Ruby
sferik
630
63k
Sharpening the Axe: The Primacy of Toolmaking
bcantrill
46
3k
The agentic SEO stack - context over prompts
schlessera
0
950
Kristin Tynski - Automating Marketing Tasks With AI
techseoconnect
PRO
0
530
So, you think you're a good person
axbom
PRO
2
2.2k
Producing Creativity
orderedlist
PRO
348
41k
StorybookのUI Testing Handbookを読んだ
zakiyama
31
6.9k
Paper Plane
katiecoart
PRO
4
53k
Transcript
©HEARTBEATS Inc.All rights reserved React Native と WebView を 堅実に連携させる
株式会社 HEARTBEATS(旧商号:株式会社 ventus) 岩田風多 (cm-ayf)
©HEARTBEATS Inc.All rights reserved 電子トレカ®コレクションサービス ORICAL® をガワネイティブでストアに配信 • ウェブアプリとして活発に運用されているサービス ◦
御歳6歳のレガシーなコードベース ◦ 20以上あるコンテンツごとに UI をカスタマイズ ◦ Weekly のリリーススケジュール • iOS / Android アプリとして配信したい ◦ ストアで配信したい ◦ アプリ内課金・リワード広告などを実装したい ◦ (昔は React Native で二重実装していた) • ガワネイティブにしよう ◦ WebView で Web アプリを表示 ◦ アプリ側から Web アプリに 安定したインターフェースを提供
©HEARTBEATS Inc.All rights reserved React Native でアプリを実装して WebView と型を共有しながら連携 •
React Native と bridge.js、bridge.js と Web アプリの間で型を共有 ◦ React Native が WebView に注入する bridge.js も型チェック • React Native のツールチェーンで bridge.js もビルド ◦ Babel プラグインで import によってコード文字列を得る ◦ Metro の dev サーバーでちゃんとリロードできる • 実際に Firebase Auth を簡単・安全に連携している ◦ bridge.js から Persistence を提供するだけで連携
©HEARTBEATS Inc.All rights reserved • 環境の境界とリポジトリの境界を別の場所に置いている ◦ 環境の境界は型が安定していない ◦ リポジトリ・リリースの境界は安定したインターフェースが必要
• 下図の全体で1つの型定義を共有することができる React Native と bridge.js、bridge.js と Web アプリの間で型を共有 React Native bridge.js Web アプリ アプリのリポジトリ Web のリポジトリ WebView 上で実行 Hermes で実行 リポジトリ・リリースの境界 (安定したインターフェース ) 環境の境界 (Comlink over postMessage)
©HEARTBEATS Inc.All rights reserved • bridge.js は React Native 内では文字列として扱う
◦ WebView の injectedJavaScript に渡すため ◦ default import で文字列が得られるように Babel でトランスパイルする • Reload on save や *.{ios,android}.js に対応 ◦ import はあくまで Metro が解決するため React Native のツールチェーンで bridge.js もビルド // window.AppBridge を定義 import './bridge'; window.AppBridge.LoggerService .addListener((level, log) => { console[level](log); }); // window.AppBridge を定義 import $1 from './bridge'; export default $1 + `window.AppBridge.LoggerService .addListener((level, log) => { console[level](log); });`; アプリのリポジトリに commit injectedJavaScript に変換
©HEARTBEATS Inc.All rights reserved • Firebase Auth の認証情報ストアを React Native
に委託する ◦ React Native 側と同じ認証情報を参照・永続化 ◦ https://firebase.google.com/docs/auth/web/auth-state-persistence?hl=ja • bridge.js で interface Persistence を実装するクラスを提供 ◦ Web アプリ側では global に生えているクラスを指定するだけ ◦ Comlink だけでは同期的に new Persistence() できない 実際に Firebase Auth を簡単・安全に連携 // bridge.js /** @implements PersistenceInternal */ class ProxiedPersistence { async _isAvailable() { /* call bridge */ } async _get(key) { /* call bridge */ } async _set(key, value) { /* call bridge */ } async _remove(key) { /* call bridge */ } } window.AppBridge.ProxiedPersistence = ProxiedPersistence; // Web アプリ側 if (window.AppBridge?.ProxiedPersistence) { initializeAuth(app, { persistence: window.AppBridge.ProxiedPersistence, }) }
©HEARTBEATS Inc.All rights reserved • これまで:細々と保守してまいりました ◦ 2024年9月リリースから安定して稼働中 ◦ 2025年2月に古い
React Native 製アプリをリプレース • これから:欲しいと言われたらすぐにアプリを提供できます ◦ 2026年3月にも新しいアプリをリリース ◦ 短いリードタイム・少ない工数で新しいアプリをリリースできる これまでとこれから
©HEARTBEATS Inc.All rights reserved • 当アプリの保守・新規アプリリリース等 ◦ https://collection.ultraman-cardgame.com/ など •
別の「普通の」React Native アプリの新規開発・保守 • 採用窓口: https://hrmos.co/pages/heartbeats/jobs/0022059 ↓ • 技術ブログ:https://zenn.dev/p/ventus ◦ 私が全然 React Native じゃない記事を上げてます アプリエンジニアを募集しています!