Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
WebViewをNativeのように使いたい / Using-WebView-like-Nat...
Search
marcy731
March 22, 2023
Programming
2
350
WebViewをNativeのように使いたい / Using-WebView-like-Native-App
2023/03/22に行われたEbisu.mobile #1で登壇した時の資料です。
https://hey.connpass.com/event/276211/
marcy731
March 22, 2023
Tweet
Share
More Decks by marcy731
See All by marcy731
めざせ!WKWebViewマスター! / WKWebView Master
marcy731
3
480
GitHub Copilotのススメ
marcy731
1
650
Introduction to Memory Management in Swift - Swiftのメモリ管理を知る -
marcy731
0
13
ステートマシンを活用したWebView-ネイティブ間連携へのアプローチ / An Approach to WebView-Native Communication Using State Machines
marcy731
1
1.1k
「アプリをつくる仕組み」の構築 / build-system-for-STORES-Branded-Apps
marcy731
0
580
Other Decks in Programming
See All in Programming
null or undefined
susisu
20
4k
Rubyとクリエイティブコーディングの輪の広がり / The Growing Circle of Ruby and Creative Coding
chobishiba
1
220
Web技術を駆使してユーザーの画面を「録画」する
yukukotani
13
6.2k
数値を文字列に整形する際の落とし穴とその解決策(iOSDC2024 ルーキーズLT) / iOSDC Japan 2024 Formatting Floating-Point Numbers
glassfiber
0
250
Amebaチョイス立ち上げの裏側 ~依存システムとの闘い~
daichi_igarashi
0
220
健康第一!MetricKitで始めるアプリの健康診断 / App Health Checkups Starting with MetricKit
nekowen
4
790
LangChainの現在とv0.3にむけて
os1ma
3
650
ESLint Rule により事業, 技術ドメインに沿った制約と誓約を敷衍させるアプローチのすゝめ
shinyaigeek
1
2.7k
プログラマのための音楽入門
cheebow
4
540
Uncharted packages (Laravel Live Denmark)
freekmurze
0
140
実践 Advanced CallKit 〜快適な通話の実現に向けて〜
mot_techtalk
3
110
Regular Expressions, REXML, Automata Learning
makenowjust
0
180
Featured
See All Featured
A Tale of Four Properties
chriscoyier
155
22k
The Language of Interfaces
destraynor
153
23k
The Cost Of JavaScript in 2023
addyosmani
39
5.1k
Imperfection Machines: The Place of Print at Facebook
scottboms
263
13k
Understanding Cognitive Biases in Performance Measurement
bluesmoon
25
1.3k
Code Reviewing Like a Champion
maltzj
518
39k
Designing with Data
zakiwarfel
98
5k
The Illustrated Children's Guide to Kubernetes
chrisshort
46
48k
Easily Structure & Communicate Ideas using Wireframe
afnizarnur
190
16k
WebSockets: Embracing the real-time Web
robhawkes
59
7.3k
Raft: Consensus for Rubyists
vanstee
135
6.5k
A better future with KSS
kneath
235
17k
Transcript
ヘイ株式会社 WebViewをNativeのように使いたい STORES株式会社 iOSエンジニア 長谷川 将司(@marcy731) 2023/03/22 Ebisu.mobile #1
アジェンダ 2 ❏ WebViewとNativeアプリの違い ❏ WebViewを使うメリットとデメリット ❏ WebViewをNativeアプリのように使う方法を考える ❏ まとめ
WebViewはお好きですか? 3 WebView
WebViewはお好きですか? 4 モ バ イ ル エ ン ジ ニ
ア
WebViewとNativeの違い 5 WebView ❏ Webページを表示するコンポーネントを利用して実装 Native ❏ iOS/AndroidのSDKを利用して実装
WebViewを使うメリットとデメリット 6 メリット ❏ Web資産の再利用 ❏ 開発時間・コストの削減 ❏ サーバー側での変更が即座に反映 デメリット
❏ Nativeに比べ、パフォーマンスが劣る ❏ Native UIとの親和性が低い
WebViewを使うメリットとデメリット 7 メリット ❏ Web資産の再利用 ❏ 開発時間・コストの削減 ❏ サーバー側での変更が即座に反映 デメリット
❏ Nativeに比べ、パフォーマンスが劣る ❏ Native UIとの親和性が低い ⇨ UXの低下にもつながる
WebViewという選択 8 好き嫌い、メリットデメリットはありつつ ビジネス上 あえてWebViewを使う という選択を取ることは多々ある
STORES ブランドアプリとWebView 9 Native WebView
Native UIとの親和性を上げる 10 WebViewを使う場合、 ❏ Native UIとの親和性が低い ⇨ 親和性をあげる ⇨ アプリ全体としてのユーザー体験の向上
WebViewをNativeアプリのように使う方法を考える
12 Native - NavigationBar - title view - back buttom
- TabBar WebView WebViewをNativeアプリのように使う方法を考える Push ❏ 今回は一覧画面はNative、詳細画面はWebView という構成を考える
WebViewをNativeアプリのように使う方法 1. 不要な要素の削除
❏ NavigationBar / Header ❏ ToolBar / TabBar ⇨ 二重に表示され、統一感がない
⇨ Native操作とWebView操作が異なる 一般的なWebView実装 14 WebView SFSafariViewController
❏ NavigationBar / Header ❏ ToolBar / TabBar ⇨ 不要なHeader/Footerの削除
⇨ 不要なToolBarの削除(実装しない) 一般的なWebView実装 15 WebView SFSafariViewController
不要なHeader/Footerの削除
17 不要なHeader/Footerの削除 ❏ header/footerに対してremove()するJavaScriptを用意し挿入
❏ WKUserScriptを利用してJSをドキュメント読み取り前後に仕込む JavaScriptでWebView内のDom操作 18
19 JavaScriptでWebView内のDom操作
20 JavaScriptでWebView内のDom操作 ⇨ Document読み込み後にJSを挿入
❏ 不要な要素は削除されるが…一瞬削除前の要素がチラつく 21 JavaScriptでWebView内のDom操作
MutationObserverの利用
MutationObserverとは ❏ DOM要素の変更を監視し、変更が検出された場合にコールバック関数 を実行するJavaScriptのAPI 23 MutationObserverの利用
❏ atDocumentStartのタイミングで挿入し、Header/Footerを監視 ❏ 対象を検知次第、すみやかに削除 ❏ 削除前の要素がチラつくことはなくなる 24 MutationObserverの利用
25 MutationObserverの利用
26 MutationObserverの利用
27 MutationObserverの利用
28 MutationObserverの利用
29 MutationObserverの利用
❏ atDocumentStartのタイミングで挿入し、Header/Footerを監視 ❏ 対象を検知次第、すみやかに削除 ❏ 削除前の要素がチラつくことはなくなる 30 MutationObserverの利用
WebViewをNativeアプリのように使う方法 2. WebView操作をNative操作へ統合
2. Native操作への統合 32 Before After ❏ ToolBarを実装しない代わりに、同等の操作をNativeに置き換える
「戻る」をNavigationBarに統一
「戻る」をNavigationBarに統一 34 ❏ WebViewの「戻る」と、Nativeアプリの「戻る」が異なる Push Native WebView WebView Link
NavigationBarに「戻る」を統一 35 ❏ WebViewの「戻る」と、Nativeアプリの「戻る」が異なる Push Native WebView WebView Link Back
NavigationBarに「戻る」を統一 36 ❏ WebViewの「戻る」と、Nativeアプリの「戻る」が異なる Push Native WebView WebView Link Back
❎
NavigationBarに「戻る」を統一 37 ❏ WebViewの「戻る」と、Nativeアプリの「戻る」が異なる Push Native WebView WebView Link Back
❎
NavigationBarに「戻る」を統一 38 ❏ navigationBar(_:shouldPop:) を利用
NavigationBarに「戻る」を統一 39 ❏ WebViewの「戻る」と、Nativeアプリの「戻る」を統一
NavigationBarに「戻る」を統一 40 ❏ WebViewの「戻る」と、Nativeアプリの「戻る」を統一
NavigationBarに「戻る」を統一 41 ❏ WebViewの「戻る」と、Nativeアプリの「戻る」を統一 Push Native WebView WebView Link Back
✅
NavigationBarに「戻る」を統一 42 ❏ ただし、NavigationStackにWebViewしかない時は「戻る」がない Link WebView WebView WebView Link
NavigationBarに「戻る」を統一 43 ❏ NavigationStackがWebViewのみの時、Push遷移を行う Push WebView WebView WebView Link
44 NativeのPush遷移をおこなう
45 NativeのPush遷移をおこなう
NavigationBarに「戻る」を統一 46 ❏ NavigationStackがWebViewのみの時、Push遷移を行う Push WebView WebView WebView Link
「更新」はPull to Refreshで実装
48 「更新」はPull to Refreshで実装 ❏ 「更新」はNative UIのPull to Refreshに統合
49 「更新」はPull to Refreshで実装 ❏ WKWebView > UIScrollViewにUIRefreshControlを設定
まとめ
まとめ 51 ❏ WebView UIとNative UIの親和性の向上が大事 ❏ 不要な要素を削除 ❏ header/footerなどを削除
❏ MutationObserverはとても便利 ❏ Native操作への統合 ❏ 「戻る」はNavigationBarに ❏ 「更新」はPull to Refresh
52 WebView まとめ
まとめ 53
54