Download free for 30 days
Sign in
Upload
Language (EN)
Support
Business
Mobile
Social Media
Marketing
Technology
Art & Photos
Career
Design
Education
Presentations & Public Speaking
Government & Nonprofit
Healthcare
Internet
Law
Leadership & Management
Automotive
Engineering
Software
Recruiting & HR
Retail
Sales
Services
Science
Small Business & Entrepreneurship
Food
Environment
Economy & Finance
Data & Analytics
Investor Relations
Sports
Spiritual
News & Politics
Travel
Self Improvement
Real Estate
Entertainment & Humor
Health & Medicine
Devices & Hardware
Lifestyle
Change Language
Language
English
Español
Português
Français
Deutsche
Cancel
Save
Submit search
EN
SF
Uploaded by
Shingo Fukuyama
PPTX, PDF
4,924 views
iOS WKWebViewの魔改造 - iOSDC 2018
iOS WKWebViewの魔改造 - iOSDC 2018 in Japan
Technology
◦
Read more
10
Save
Share
Embed
Embed presentation
Download
Download to read offline
1
/ 53
2
/ 53
3
/ 53
4
/ 53
5
/ 53
6
/ 53
7
/ 53
8
/ 53
9
/ 53
10
/ 53
11
/ 53
12
/ 53
13
/ 53
14
/ 53
15
/ 53
16
/ 53
17
/ 53
18
/ 53
19
/ 53
20
/ 53
21
/ 53
22
/ 53
23
/ 53
24
/ 53
25
/ 53
26
/ 53
27
/ 53
28
/ 53
29
/ 53
30
/ 53
31
/ 53
32
/ 53
33
/ 53
34
/ 53
Most read
35
/ 53
36
/ 53
37
/ 53
38
/ 53
39
/ 53
40
/ 53
41
/ 53
42
/ 53
43
/ 53
44
/ 53
45
/ 53
46
/ 53
47
/ 53
48
/ 53
49
/ 53
50
/ 53
51
/ 53
52
/ 53
53
/ 53
More Related Content
PDF
Web開発者が始める .NET MAUI Blazor App
by
TomomitsuKusaba
PPTX
MVPパターンによる設計アプローチ「あなたのアプリ報連相できてますか」
by
U-dai Yokoyama
PPTX
世界一わかりやすいClean Architecture
by
Atsushi Nakamura
PPTX
AR / VR / MRの世界に、置けるUI、置けないUI、置くべきUI
by
Koichi Tanaka
PDF
マイクロサービスバックエンドAPIのためのRESTとgRPC
by
disc99_
PDF
インタフェース完全に理解した
by
torisoup
PDF
WebRTC と Native とそれから、それから。
by
tnoho
PDF
UniRx完全に理解した
by
torisoup
Web開発者が始める .NET MAUI Blazor App
by
TomomitsuKusaba
MVPパターンによる設計アプローチ「あなたのアプリ報連相できてますか」
by
U-dai Yokoyama
世界一わかりやすいClean Architecture
by
Atsushi Nakamura
AR / VR / MRの世界に、置けるUI、置けないUI、置くべきUI
by
Koichi Tanaka
マイクロサービスバックエンドAPIのためのRESTとgRPC
by
disc99_
インタフェース完全に理解した
by
torisoup
WebRTC と Native とそれから、それから。
by
tnoho
UniRx完全に理解した
by
torisoup
What's hot
PPTX
GraalVMのJavaネイティブビルド機能でどの程度起動が速くなるのか?~サーバレス基盤上での評価~ / How fast does GraalVM's...
by
Shinji Takao
PDF
アプリ屋もDockerをドカドカ使おう ~ Docker入門
by
Hori Tasuku
PDF
Consistent hash
by
paulowniaceae
PPTX
ぱぱっと理解するSpring Cloudの基本
by
kazuki kumagai
PDF
エンジニアから飛んでくるマサカリを受け止める心得
by
Reimi Kuramochi Chiba
PDF
SharePoint Framework Extension 基礎講座
by
Hiroaki Oikawa
PDF
go_router が隠してくれるもの
by
cch-robo
PDF
Unityによるリアルタイム通信とMagicOnionによるC#大統一理論の実現
by
Yoshifumi Kawai
PDF
REST API のコツ
by
pospome
PDF
WebSocket / WebRTCの技術紹介
by
Yasuhiro Mawarimichi
PDF
今からでも遅くないDBマイグレーション - Flyway と SchemaSpy の紹介 -
by
onozaty
PDF
[NDC17] Unreal.js - 자바스크립트로 쉽고 빠른 UE4 개발하기
by
현철 조
PPTX
Gocon2017:Goのロギング周りの考察
by
貴仁 大和屋
PDF
Ormとの付き合い方
by
豊明 尾古
PPTX
WebRTCを利用した遠隔リアルタイム映像処理フレームワークの実装
by
tnoho
PDF
MQTTとAMQPと.NET
by
terurou
PDF
ネットワーク ゲームにおけるTCPとUDPの使い分け
by
モノビット エンジン
PDF
[야생의 땅: 듀랑고] 서버 아키텍처 - SPOF 없는 분산 MMORPG 서버
by
Heungsub Lee
PDF
[NDC18] 만들고 붓고 부수고 - 〈야생의 땅: 듀랑고〉 서버 관리 배포 이야기
by
Chanwoong Kim
PPTX
KGC 2016: HTTPS 로 모바일 게임 서버 구축한다는 것 - Korea Games Conference
by
Xionglong Jin
GraalVMのJavaネイティブビルド機能でどの程度起動が速くなるのか?~サーバレス基盤上での評価~ / How fast does GraalVM's...
by
Shinji Takao
アプリ屋もDockerをドカドカ使おう ~ Docker入門
by
Hori Tasuku
Consistent hash
by
paulowniaceae
ぱぱっと理解するSpring Cloudの基本
by
kazuki kumagai
エンジニアから飛んでくるマサカリを受け止める心得
by
Reimi Kuramochi Chiba
SharePoint Framework Extension 基礎講座
by
Hiroaki Oikawa
go_router が隠してくれるもの
by
cch-robo
Unityによるリアルタイム通信とMagicOnionによるC#大統一理論の実現
by
Yoshifumi Kawai
REST API のコツ
by
pospome
WebSocket / WebRTCの技術紹介
by
Yasuhiro Mawarimichi
今からでも遅くないDBマイグレーション - Flyway と SchemaSpy の紹介 -
by
onozaty
[NDC17] Unreal.js - 자바스크립트로 쉽고 빠른 UE4 개발하기
by
현철 조
Gocon2017:Goのロギング周りの考察
by
貴仁 大和屋
Ormとの付き合い方
by
豊明 尾古
WebRTCを利用した遠隔リアルタイム映像処理フレームワークの実装
by
tnoho
MQTTとAMQPと.NET
by
terurou
ネットワーク ゲームにおけるTCPとUDPの使い分け
by
モノビット エンジン
[야생의 땅: 듀랑고] 서버 아키텍처 - SPOF 없는 분산 MMORPG 서버
by
Heungsub Lee
[NDC18] 만들고 붓고 부수고 - 〈야생의 땅: 듀랑고〉 서버 관리 배포 이야기
by
Chanwoong Kim
KGC 2016: HTTPS 로 모바일 게임 서버 구축한다는 것 - Korea Games Conference
by
Xionglong Jin
Recently uploaded
PDF
エンジニアが選ぶべきAIエディタ & Antigravity 活用例@ウェビナー「触ってみてどうだった?Google Antigravity 既存IDEと...
by
NorihiroSunada
PDF
20251210_MultiDevinForEnterprise on Devin 1st Anniv Meetup
by
Masaki Yamakawa
PDF
流行りに乗っかるClaris FileMaker 〜AI関連機能の紹介〜 by 合同会社イボルブ
by
Evolve LLC.
PPTX
楽々ナレッジベース「楽ナレ」3種比較 - Dify / AWS S3 Vector / Google File Search Tool
by
Kiyohide Yamaguchi
PDF
Machine Tests Benchmark Suite. Explain github.com/alexziskind1/machine_tests #2
by
Tasuku Takahashi
PDF
Machine Tests Benchmark Suite. Explain github.com/alexziskind1/machine_tests #1
by
Tasuku Takahashi
エンジニアが選ぶべきAIエディタ & Antigravity 活用例@ウェビナー「触ってみてどうだった?Google Antigravity 既存IDEと...
by
NorihiroSunada
20251210_MultiDevinForEnterprise on Devin 1st Anniv Meetup
by
Masaki Yamakawa
流行りに乗っかるClaris FileMaker 〜AI関連機能の紹介〜 by 合同会社イボルブ
by
Evolve LLC.
楽々ナレッジベース「楽ナレ」3種比較 - Dify / AWS S3 Vector / Google File Search Tool
by
Kiyohide Yamaguchi
Machine Tests Benchmark Suite. Explain github.com/alexziskind1/machine_tests #2
by
Tasuku Takahashi
Machine Tests Benchmark Suite. Explain github.com/alexziskind1/machine_tests #1
by
Tasuku Takahashi
iOS WKWebViewの魔改造 - iOSDC 2018
1.
WKWebViewの魔改造
2.
福山 慎吾 Shingo Fukuyama
4.
iOS Web Browser
App 2014~
5.
• 高速DOM (Document
Object Model) 操作 • WKWebView内動画をAVPlayerでバックグラウンド再生 • WKWebView内ジェスチャへのアクセスと操作 • JavaScript -> Swift Tips WKWebView
6.
WKWebView
7.
UIWebView
8.
UIWebView iOS 12で公式に非推奨・廃止予定
9.
•速い: レンダリング、JavaScript実行速度 •安全: プロセスが分離されている •安定:
アプリをクラッシュさせない WKWebView
10.
WKWebView Swift JavaScript
11.
WKWebViewにJavaScriptを注入
13.
WKWebView と組み合わせると強力な JavaScript API..
14.
Mutation Observer JavaScript API
15.
Mutation Observer
16.
Mutation Observer
17.
WKWebView + Mutation
Observer
18.
WKWebView + Mutation
Observer • DOM要素の変更(削除,非表示,置換等)をレンダリングの前に行える
19.
WKWebView + Mutation
Observer • DOM要素の変更(削除,非表示,置換等)をレンダリングの前に行える • 要素がDOMツリーに追加された直後に EventListener をセットでき る
20.
WKWebView + Mutation
Observer • DOM要素の変更(削除,非表示,置換等)をレンダリングの前に行える • 要素がDOMツリーに追加された直後に EventListener をセットでき る • すべてのDOM要素を監視・非同期操作してもパフォーマンスに大 きな影響は見られない
21.
WKWebView + Mutation
Observerの活用例
22.
WKWebView + Mutation
Observerの活用例 • 細かく設定できiOS 10以前でも使えるコンテンツブロック
23.
WKWebView + Mutation
Observerの活用例 • 細かく設定できiOS 10以前でも使えるコンテンツブロック • リアルタイムでスタイルを変更
24.
WKWebView + Mutation
Observerの活用例 • 細かく設定できiOS 10以前でも使えるコンテンツブロック • リアルタイムでスタイルを変更 • イベントの即時監視
25.
WKWebView内動画 バックグラウンド再生
26.
WKWebView動画 アプリ起動中のみ
27.
WKWebView動画 アプリ起動中のみ AVPlayer
28.
WKWebView動画 アプリ起動中のみ アプリ起動中 ホーム画面 他アプリ使用中 デバイスロック中 Picture in
Picture (iPad) AVPlayer
29.
WKWebView動画 アプリ起動中のみ AVPlayer URL アプリ起動中 ホーム画面 他アプリ使用中 デバイスロック中 Picture in Picture
(iPad)
30.
動画URLの取得
31.
<video src=“video.mp4”>
32.
<video src=“dummy.mp4”> ダミーファイル
33.
Playイベント発火時 <video src=“video.mp4”> or <video> <source src=“video.mp4” type=“video/mp4”> </video> 本物の動画リンクが現れる
34.
Class WKWebViewConfiguration var allowsInlineMediaPlayback:
Bool { get set } デフォルト値: false (iPhone), true (iPad) iOS 10.0 より前への対応は <video> タグにwebkit-playsinlineをつける WKWebView独自の動画プレイヤーを無効化
35.
WKWebView内の動画をバックグラウンド再生
36.
WKWebView内の動画をバックグラウンド再生 1. Mutation Observerで<video>タグ追加時にすぐ捕まえる
37.
1. Mutation Observerで<video>タグ追加時にすぐ捕まえる 2.
EventListenerで<video>タグのplayイベントを監視する WKWebView内の動画をバックグラウンド再生
38.
1. Mutation Observerで<video>タグ追加時にすぐ捕まえる 2.
EventListenerで<video>タグのplayイベントを監視する 3. WKScriptMessageHandlerで本物の動画URLをSwift側へ通知する WKWebView内の動画をバックグラウンド再生
39.
1. Mutation Observerで<video>タグ追加時にすぐ捕まえる 2.
EventListenerで<video>タグのplayイベントを監視する 3. WKScriptMessageHandlerで本物の動画URLをSwift側へ通知する 4. デフォルトプレイヤーの起動を阻止し、バックグラウンド再生や PIPの設定をしたAVPlayerで再生 WKWebView内の動画をバックグラウンド再生
40.
WKWebView内ジェスチャーの操作
41.
WKWebView内ジェスチャーの操作
42.
WKWebView内ジェスチャーの操作 1. 呼び水としてWKWebViewにpanジェスチャをつける
43.
WKWebView内ジェスチャーの操作 1. 呼び水としてWKWebViewにpanジェスチャをつける 2. UIGestureRecognizerDelegateの gestureRecognizer(_:shouldRecognizeSimultan eouslyWith:)
で取り出す
44.
WKWebView内ジェスチャーの操作 1. 呼び水としてWKWebViewにpanジェスチャをつける
45.
WKWebView内ジェスチャーの操作 2. UIGestureRecognizerDelegateで取り出す
46.
WKWebView内ジェスチャーの操作
47.
WKWebView内ジェスチャーの操作 活用例: リンク長押し時間の変更
48.
WKWebView内ジェスチャーの操作 活用例: webview上のスクロール領域を認識
49.
WKScriptMessageHandler 活用例
50.
WKScriptMessageHandler 活用例 document.cookieへの変更を監視
51.
WKScriptMessageHandler 活用例 Ajax通信リクエストを監視、すり替え
52.
サンプルアプリ https://github.com/ShingoFukuyama/BackgroundVideoW KWebViewSample WKWebView内の動画をバックグラウンド再生
53.
ありがとうございました
Editor's Notes
#2
WKWebViewの魔改造というタイトルで話します。 自己紹介
#3
福山慎吾といいます。 IOSDCに参加するのは2回目ですが、 こういう場で話すことは初めてなのでよろしくお願いします。
#4
今は楽天でROOMというアプリの開発に携わっています。 これは楽天市場のショッピングSNSです。 欲しいものや、購入したものを投稿をして それを見たほかの人がその商品を購入すると、投稿した人も買った人も楽天ポイントがもらえるというアプリです。 最近Texture 旧名AsyncDisplayKitを導入し始めたので、現時点ではメイン画面だけスクロールがぬるぬる動くと思います。よかったら試してみてください。 今回、話す内容はこのアプリではなく、
#5
このアプリ。 2014年からiOSのWebブラウザアプリを趣味で作っています。 ちょうどこのとき、iOS 8でWKWebViewも公開されました。 当時のWKWebViewはできないことばかりで、たいへん苦労しました。 今回はその中で、今でも使えるWKWebViewの技術を紹介します。
#6
内容はこちら 高速DOM、Document Object Model 操作。 これによってリアルタイムにコンテンツブロックやスタイル操作を行えるようになります。 WKWebView内の動画をカスタマイズしたAVPlayerでバックグラウンド再生できるようにします。これに関してはサンプルアプリも後ほど公開します。 WKWebView内部のジェスチャへのアクセスと操作。 あることをするとWKWebView内にある独自のUIGestureRecognizerを扱えるようになります。 そして最後に少し、JavaScriptからSwiftへの通知で役立ちそうなサンプルを紹介します。
#7
WKWebView ここ最近、再びWKWebViewが注目され始めました。 なんでだと思いますか? それは、、、
#8
UIWebView. iOSがまだiPhone OSと呼ばれていた時代、 2008年から10年も存在し続けているAPIです。 それがこのたび iOS 12で、
#9
公式に非推奨・廃止予定となりました。 今までは非推奨となってはいなかったものの、AppleからもWKWebViewへ移行するように促すドキュメントも見られました。 [アンケート] 興味本位に少し聞いてみたいんですけど、 この会場の中で、今取り組んでいるプロジェクトでUIWebViewを使っている、 または移行中というかた。少し手を上げていただけますでしょうか? Result: more than 30%
#10
次にWKWebViewとUIWebViewとの比較を簡単に紹介します。 レンダリング速度、JavaScriptの実行速度が高速化されています。 アプリ自体とWKWebView、ネットワーク処理はそれぞれ別のプロセスで動作しているため、どれかにセキュリティ問題が生じても全てに影響しにくくなっています。 プロセスが分離されているため、WKWebViewのプロセスがクラッシュしたとしても、アプリ自体はクラッシュしません。 iOS Google ChromeがUIWebViewからWKWebViewへ移行した際にクラッシュ率が70%減少したという記事もあります。
#11
では、SwiftとJavaScriptを使ってゴリゴリしていきます。 SwiftからWKWebViewへJavaScriptを注入する方法の一つに evaluateJavaScript:completionHandler: というメソッドもありますが、今回は別の方法を使います。
#12
Webページのコンテンツ読み込み前、もしくは読み込み後に毎回自動でJavaScriptを実行する WKUserScriptを使います。 コードはこんな感じで WKWebViewConfigurationで設定します。
#13
注入のタイミングは2パターン。 Documentが読み込まれた後でかつコンテンツの読み込み前。 コンテンツの読み込み後かつ画像などのサブリソースのロード前です。
#14
ここで何を実行するのか。 それがこれから紹介するもの。 WKWebViewと組み合わせると強力でいろいろできるJavaScript APIがあります。 それが、
#15
Mutation Observerというものです。 このAPIはDOMの変更を監視するものです。 通常のWebページで使われることは稀かれもしれませんが、 不特定多数のWebページを扱うWebブラウザで力を発揮します。
#16
このように設定ができ、DOM変更に加えて、特定のattributes変更のみを監視することもできます。 Documentを監視対象にすることで<html>タグを含む全ての変更を監視できます。
#17
変更結果はリアルタイムに配列として帰ってきます。 ここで特定の要素をフィルターして、変更を加えていきます。 モダンなJavaScriptの書き方には、 キャッチアップしていないので勘弁してください。
#18
WKWebViewとMutation Observerを組み合わせることで得られるメリットは、
#19
DOM要素の変更、削除、非表示、置換などをレンダリングの前に行えます。
#20
そして、要素がDOMツリーに追加された直後に JavaScript APIのEventListenerを追加でき、 イベントを監視することができます。
#21
ベンチマークを取ったわけではありませんが、 すべてのDOM要素を監視・非同期操作してもパフォーマンスに大きな影響は見られませんでした。 同期操作では重たくなるので非同期 setTimeout、最近ではPromiseでしょうか。 を使います。
#22
WKWebViewとMutationObserverの活用例
#23
iOS 11でコンテンツブロックがWKWebViewにも導入されましたが、 それより前のiOSでも有効な手法です。 もちろんiOS 11のコンテンツブロックと組み合わせることでより強力なコンテンツブロックが可能になります。
#24
レンダリングの前にスタイルを操作できるため、 ユーザーから見てもスタイルが変わる瞬間に気づくことはありません。
#25
そしてEventListenerを追加してイベントの即時監視ができます。 これは次に話すことに関連してきます。
#26
WKWebView内動画のバックグラウンド再生方法について話します。
#27
通常WKWebView内で動画を再生すると、アプリ起動中のみ再生を行えます。 一方
#28
AVKitのAVPlayerでは
#29
ホーム画面、 ほかアプリ使用中、 デバイスロック中 に動画の音声が継続して再生できます。 さらにiPadではPIP、Picture in Pictureを使って 動画をホーム画面や他のアプリにいるときでも小窓で再生することが可能です。
#30
AVPlayerで再生できればなんでもできそうです。 単純にWKWebViewの動画からURLをぽんっと渡せば良さそうですが、 通常の動画サイトはなんらかの対策をとっており、そうはさせてくれません。
#31
動画URLの取得
#32
src属性にあるURLをコピーすれば良さそうですが、
#33
これは通常ダミーファイルもしくは空となっています。 しかし、本物の動画URLが現れる瞬間があります。
#34
それがplayイベント発火時です。 このときのURLをSwift側のAVPlayerへ渡します。 ちなみにAndroidのWebViewはBlob URLでの再生に対応しており、 この方法ではうまくいきません。 そのまえに、
#35
WKWebViewのデフォルトプレイヤーが出てくるのを防ぐ必要があります。 WKWebViewConfigurationには allowsInlineMediaPlaybackというプロパティがあり、 初期値はiPhoneではfalse、iPadではtrueとなっています。 この値をtrueにして、インライン再生の設定を行えば、全画面化することなくWebページの上で再生できます。 iOS 10より前への対応は<video>タグにwebkit-playsinlineという属性をつけると大丈夫です。 再生を開始した<video>タグは用済みなので即座に停止させます。
#36
WKWebView内の動画バックグラウンド再生 のまとめ
#37
Mutation Observerで<video>タグ追加時に捕まえる
#38
EventListenerで<video>タグのplayイベントを監視する
#39
WKScriptMessageHandlerで本物の動画URLをSwift側へ通知する
#40
デフォルトプレイヤーの起動を阻止し、バックグラウンド再生やPIPの設定をしたAVPlayerで再生 サンプルアプリは後で公開します。
#41
WKWebView内ジェスチャの操作
#42
->
#43
まず、呼び水としてWKWebViewにpanジェスチャをつけます。
#44
UIGestureRecognizerDelegate gestureRecognizer(_:shouldRecognizeSimultaneouslyWith:) で取り出します。 呼び水にしたジェスチャと衝突した他のWKWebView内ジェスチャがここで姿を現します。
#45
WKWebView自体にpanジェスチャをつける
#46
UIGestureRecognizerDelegateで取り出す。 そうすると、次のようなジェスチャが網にかかります。
#47
見慣れないものばかりですね。 これらは私達が普段使うジェスチャのサブクラスだったりするので、 親クラスにキャストすることで扱うことができます。 無効にしたり、プロパティをいじったり、特定のジェスチャをなにかの目印にするのもいいと思います。
#48
活用例です。 特定のLongPressGestureを捕まえて WKWebView内リンクの長押し時間を変更したり、
#49
WKWebView上のスクロール可能領域を操作中かどうかを判定できます。
#50
次はWKScriptMessageHandlerの活用例を紹介します。 SwiftやObjective-Cで言うところの黒魔術のJavaScript版です。 WKScriptMessageHandlerはJavaScriptからSwiftへ通知を行うものです。
#51
Document.cookieにgetterとsetterを生やします。 もともとの機能は保たれており、 Cookieが追加された瞬間にSwift側へ値とともに通知する仕組みです。 Cookieに限らず様々なJavaScriptのプロパティを監視できるようになります。
#52
Ajax通信リクエストの監視、すり替え XMLHttpRequestをオーバーライドする形で 既存の働きの前にURLフィルタをかけ、ブロックしたい通信をすり替えています。
#53
最後に こちらが動画再生のサンプルアプリです。 [時間があればデモ] [PR]
Download