SlideShare a Scribd company logo
WKWebViewの魔改造
福山 慎吾
Shingo Fukuyama
iOS Web Browser App
2014~
• 高速DOM (Document Object Model) 操作
• WKWebView内動画をAVPlayerでバックグラウンド再生
• WKWebView内ジェスチャへのアクセスと操作
• JavaScript -> Swift Tips
WKWebView
WKWebView
UIWebView
UIWebView
iOS 12で公式に非推奨・廃止予定
•速い: レンダリング、JavaScript実行速度
•安全: プロセスが分離されている
•安定: アプリをクラッシュさせない
WKWebView
WKWebView
Swift JavaScript
WKWebViewにJavaScriptを注入
WKWebView
と組み合わせると強力な
JavaScript API..
Mutation Observer
JavaScript API
Mutation Observer
Mutation Observer
WKWebView + Mutation Observer
WKWebView + Mutation Observer
• DOM要素の変更(削除,非表示,置換等)をレンダリングの前に行える
WKWebView + Mutation Observer
• DOM要素の変更(削除,非表示,置換等)をレンダリングの前に行える
• 要素がDOMツリーに追加された直後に EventListener をセットでき
る
WKWebView + Mutation Observer
• DOM要素の変更(削除,非表示,置換等)をレンダリングの前に行える
• 要素がDOMツリーに追加された直後に EventListener をセットでき
る
• すべてのDOM要素を監視・非同期操作してもパフォーマンスに大
きな影響は見られない
WKWebView + Mutation Observerの活用例
WKWebView + Mutation Observerの活用例
• 細かく設定できiOS 10以前でも使えるコンテンツブロック
WKWebView + Mutation Observerの活用例
• 細かく設定できiOS 10以前でも使えるコンテンツブロック
• リアルタイムでスタイルを変更
WKWebView + Mutation Observerの活用例
• 細かく設定できiOS 10以前でも使えるコンテンツブロック
• リアルタイムでスタイルを変更
• イベントの即時監視
WKWebView内動画
バックグラウンド再生
WKWebView動画
アプリ起動中のみ
WKWebView動画
アプリ起動中のみ
AVPlayer
WKWebView動画
アプリ起動中のみ アプリ起動中
ホーム画面
他アプリ使用中
デバイスロック中
Picture in Picture (iPad)
AVPlayer
WKWebView動画
アプリ起動中のみ
AVPlayer
URL
アプリ起動中
ホーム画面
他アプリ使用中
デバイスロック中
Picture in Picture (iPad)
動画URLの取得
<video src=“video.mp4”>
<video src=“dummy.mp4”>
ダミーファイル
Playイベント発火時
<video src=“video.mp4”>
or
<video>
<source src=“video.mp4”
type=“video/mp4”>
</video>
本物の動画リンクが現れる
Class WKWebViewConfiguration
var allowsInlineMediaPlayback: Bool { get set }
デフォルト値: false (iPhone), true (iPad)
iOS 10.0 より前への対応は <video> タグにwebkit-playsinlineをつける
WKWebView独自の動画プレイヤーを無効化
WKWebView内の動画をバックグラウンド再生
WKWebView内の動画をバックグラウンド再生
1. Mutation Observerで<video>タグ追加時にすぐ捕まえる
1. Mutation Observerで<video>タグ追加時にすぐ捕まえる
2. EventListenerで<video>タグのplayイベントを監視する
WKWebView内の動画をバックグラウンド再生
1. Mutation Observerで<video>タグ追加時にすぐ捕まえる
2. EventListenerで<video>タグのplayイベントを監視する
3. WKScriptMessageHandlerで本物の動画URLをSwift側へ通知する
WKWebView内の動画をバックグラウンド再生
1. Mutation Observerで<video>タグ追加時にすぐ捕まえる
2. EventListenerで<video>タグのplayイベントを監視する
3. WKScriptMessageHandlerで本物の動画URLをSwift側へ通知する
4. デフォルトプレイヤーの起動を阻止し、バックグラウンド再生や
PIPの設定をしたAVPlayerで再生
WKWebView内の動画をバックグラウンド再生
WKWebView内ジェスチャーの操作
WKWebView内ジェスチャーの操作
WKWebView内ジェスチャーの操作
1. 呼び水としてWKWebViewにpanジェスチャをつける
WKWebView内ジェスチャーの操作
1. 呼び水としてWKWebViewにpanジェスチャをつける
2. UIGestureRecognizerDelegateの
gestureRecognizer(_:shouldRecognizeSimultan
eouslyWith:) で取り出す
WKWebView内ジェスチャーの操作
1. 呼び水としてWKWebViewにpanジェスチャをつける
WKWebView内ジェスチャーの操作
2. UIGestureRecognizerDelegateで取り出す
WKWebView内ジェスチャーの操作
WKWebView内ジェスチャーの操作
活用例: リンク長押し時間の変更
WKWebView内ジェスチャーの操作
活用例: webview上のスクロール領域を認識
WKScriptMessageHandler 活用例
WKScriptMessageHandler 活用例
document.cookieへの変更を監視
WKScriptMessageHandler 活用例
Ajax通信リクエストを監視、すり替え
サンプルアプリ
https://github.com/ShingoFukuyama/BackgroundVideoW
KWebViewSample
WKWebView内の動画をバックグラウンド再生
ありがとうございました

More Related Content

What's hot

OpenVRやOpenXRの基本的なことを調べてみた
OpenVRやOpenXRの基本的なことを調べてみたOpenVRやOpenXRの基本的なことを調べてみた
OpenVRやOpenXRの基本的なことを調べてみた
Takahiro Miyaura
 
WkWebViewのキャッシュについて調べた
WkWebViewのキャッシュについて調べたWkWebViewのキャッシュについて調べた
WkWebViewのキャッシュについて調べた
firewood
 
猫でも分かるUE4を使ったARコンテンツ作り方 初級編 ver 1.0.0
猫でも分かるUE4を使ったARコンテンツ作り方 初級編 ver 1.0.0猫でも分かるUE4を使ったARコンテンツ作り方 初級編 ver 1.0.0
猫でも分かるUE4を使ったARコンテンツ作り方 初級編 ver 1.0.0
エピック・ゲームズ・ジャパン Epic Games Japan
 
スクリプトエンジン作って 無双する
スクリプトエンジン作って 無双するスクリプトエンジン作って 無双する
スクリプトエンジン作って 無双する
KLab Inc. / Tech
 
ゲームサーバ開発現場の考え方
ゲームサーバ開発現場の考え方ゲームサーバ開発現場の考え方
ゲームサーバ開発現場の考え方Daisaku Mochizuki
 
ユーザーストーリー駆動開発で行こう。
ユーザーストーリー駆動開発で行こう。ユーザーストーリー駆動開発で行こう。
ユーザーストーリー駆動開発で行こう。
toshihiro ichitani
 
プログラマが欲しい仕様書とは
プログラマが欲しい仕様書とはプログラマが欲しい仕様書とは
プログラマが欲しい仕様書とはKatsutoshi Makino
 
Unityによるリアルタイム通信とMagicOnionによるC#大統一理論の実現
Unityによるリアルタイム通信とMagicOnionによるC#大統一理論の実現Unityによるリアルタイム通信とMagicOnionによるC#大統一理論の実現
Unityによるリアルタイム通信とMagicOnionによるC#大統一理論の実現
Yoshifumi Kawai
 
Power BI をアプリに埋め込みたい? ならば Power BI Embedded だ!
Power BI をアプリに埋め込みたい? ならば Power BI Embedded だ!Power BI をアプリに埋め込みたい? ならば Power BI Embedded だ!
Power BI をアプリに埋め込みたい? ならば Power BI Embedded だ!
Teruchika Yamada
 
【Unite Tokyo 2019】バンダイナムコスタジオ流Unityの使い方
【Unite Tokyo 2019】バンダイナムコスタジオ流Unityの使い方【Unite Tokyo 2019】バンダイナムコスタジオ流Unityの使い方
【Unite Tokyo 2019】バンダイナムコスタジオ流Unityの使い方
UnityTechnologiesJapan002
 
「龍が如く7 光と闇の行方」の自動テスト活用事例とテスト自動化チーム(仮)による若手育成の取り組みについて
「龍が如く7 光と闇の行方」の自動テスト活用事例とテスト自動化チーム(仮)による若手育成の取り組みについて「龍が如く7 光と闇の行方」の自動テスト活用事例とテスト自動化チーム(仮)による若手育成の取り組みについて
「龍が如く7 光と闇の行方」の自動テスト活用事例とテスト自動化チーム(仮)による若手育成の取り組みについて
SEGADevTech
 
『ラブライブ!スクールアイドルフェスティバル ALL STARS』を支えるビルドパイプライン 〜より安定したサービス提供を目指して〜
『ラブライブ!スクールアイドルフェスティバル ALL STARS』を支えるビルドパイプライン 〜より安定したサービス提供を目指して〜『ラブライブ!スクールアイドルフェスティバル ALL STARS』を支えるビルドパイプライン 〜より安定したサービス提供を目指して〜
『ラブライブ!スクールアイドルフェスティバル ALL STARS』を支えるビルドパイプライン 〜より安定したサービス提供を目指して〜
KLab Inc. / Tech
 
新しいエフェクトツール、Niagaraを楽しもう! ~Niagara作例のブレイクダウン~
新しいエフェクトツール、Niagaraを楽しもう! ~Niagara作例のブレイクダウン~新しいエフェクトツール、Niagaraを楽しもう! ~Niagara作例のブレイクダウン~
新しいエフェクトツール、Niagaraを楽しもう! ~Niagara作例のブレイクダウン~
エピック・ゲームズ・ジャパン Epic Games Japan
 
「スキルなし・実績なし」 32歳窓際エンジニアがシリコンバレーで働くようになるまで
「スキルなし・実績なし」 32歳窓際エンジニアがシリコンバレーで働くようになるまで「スキルなし・実績なし」 32歳窓際エンジニアがシリコンバレーで働くようになるまで
「スキルなし・実績なし」 32歳窓際エンジニアがシリコンバレーで働くようになるまで
Shuichi Tsutsumi
 
UniRxでMV(R)Pパターン をやってみた
UniRxでMV(R)PパターンをやってみたUniRxでMV(R)Pパターンをやってみた
UniRxでMV(R)Pパターン をやってみた
torisoup
 
世界を跨ぐリアルタイム PvP 対戦への挑戦 [Google Cloud INSIDE Games & Apps]
世界を跨ぐリアルタイム PvP 対戦への挑戦 [Google Cloud INSIDE Games & Apps]世界を跨ぐリアルタイム PvP 対戦への挑戦 [Google Cloud INSIDE Games & Apps]
世界を跨ぐリアルタイム PvP 対戦への挑戦 [Google Cloud INSIDE Games & Apps]
Google Cloud Platform - Japan
 
#CCSE2019 GREE VR Studio Lab 「VTuber向け特殊表情コントローラの可能性と機械学習的アプローチ」(速公開版)
#CCSE2019 GREE VR Studio Lab 「VTuber向け特殊表情コントローラの可能性と機械学習的アプローチ」(速公開版)#CCSE2019 GREE VR Studio Lab 「VTuber向け特殊表情コントローラの可能性と機械学習的アプローチ」(速公開版)
#CCSE2019 GREE VR Studio Lab 「VTuber向け特殊表情コントローラの可能性と機械学習的アプローチ」(速公開版)
GREE VR Studio Lab
 
組織の問題も解決するアーキテクチャ BackendsForFrontends
組織の問題も解決するアーキテクチャ BackendsForFrontends組織の問題も解決するアーキテクチャ BackendsForFrontends
組織の問題も解決するアーキテクチャ BackendsForFrontends
PIXTA Inc.
 
UE4 Hair & Groomでのリアルタイムファーレンダリング (UE4 Character Art Dive Online)
UE4 Hair & Groomでのリアルタイムファーレンダリング (UE4 Character Art Dive Online)UE4 Hair & Groomでのリアルタイムファーレンダリング (UE4 Character Art Dive Online)
UE4 Hair & Groomでのリアルタイムファーレンダリング (UE4 Character Art Dive Online)
エピック・ゲームズ・ジャパン Epic Games Japan
 
インセプションデッキのひな形(PPT形式:ダウンロード用)
インセプションデッキのひな形(PPT形式:ダウンロード用)インセプションデッキのひな形(PPT形式:ダウンロード用)
インセプションデッキのひな形(PPT形式:ダウンロード用)
A AOKI
 

What's hot (20)

OpenVRやOpenXRの基本的なことを調べてみた
OpenVRやOpenXRの基本的なことを調べてみたOpenVRやOpenXRの基本的なことを調べてみた
OpenVRやOpenXRの基本的なことを調べてみた
 
WkWebViewのキャッシュについて調べた
WkWebViewのキャッシュについて調べたWkWebViewのキャッシュについて調べた
WkWebViewのキャッシュについて調べた
 
猫でも分かるUE4を使ったARコンテンツ作り方 初級編 ver 1.0.0
猫でも分かるUE4を使ったARコンテンツ作り方 初級編 ver 1.0.0猫でも分かるUE4を使ったARコンテンツ作り方 初級編 ver 1.0.0
猫でも分かるUE4を使ったARコンテンツ作り方 初級編 ver 1.0.0
 
スクリプトエンジン作って 無双する
スクリプトエンジン作って 無双するスクリプトエンジン作って 無双する
スクリプトエンジン作って 無双する
 
ゲームサーバ開発現場の考え方
ゲームサーバ開発現場の考え方ゲームサーバ開発現場の考え方
ゲームサーバ開発現場の考え方
 
ユーザーストーリー駆動開発で行こう。
ユーザーストーリー駆動開発で行こう。ユーザーストーリー駆動開発で行こう。
ユーザーストーリー駆動開発で行こう。
 
プログラマが欲しい仕様書とは
プログラマが欲しい仕様書とはプログラマが欲しい仕様書とは
プログラマが欲しい仕様書とは
 
Unityによるリアルタイム通信とMagicOnionによるC#大統一理論の実現
Unityによるリアルタイム通信とMagicOnionによるC#大統一理論の実現Unityによるリアルタイム通信とMagicOnionによるC#大統一理論の実現
Unityによるリアルタイム通信とMagicOnionによるC#大統一理論の実現
 
Power BI をアプリに埋め込みたい? ならば Power BI Embedded だ!
Power BI をアプリに埋め込みたい? ならば Power BI Embedded だ!Power BI をアプリに埋め込みたい? ならば Power BI Embedded だ!
Power BI をアプリに埋め込みたい? ならば Power BI Embedded だ!
 
【Unite Tokyo 2019】バンダイナムコスタジオ流Unityの使い方
【Unite Tokyo 2019】バンダイナムコスタジオ流Unityの使い方【Unite Tokyo 2019】バンダイナムコスタジオ流Unityの使い方
【Unite Tokyo 2019】バンダイナムコスタジオ流Unityの使い方
 
「龍が如く7 光と闇の行方」の自動テスト活用事例とテスト自動化チーム(仮)による若手育成の取り組みについて
「龍が如く7 光と闇の行方」の自動テスト活用事例とテスト自動化チーム(仮)による若手育成の取り組みについて「龍が如く7 光と闇の行方」の自動テスト活用事例とテスト自動化チーム(仮)による若手育成の取り組みについて
「龍が如く7 光と闇の行方」の自動テスト活用事例とテスト自動化チーム(仮)による若手育成の取り組みについて
 
『ラブライブ!スクールアイドルフェスティバル ALL STARS』を支えるビルドパイプライン 〜より安定したサービス提供を目指して〜
『ラブライブ!スクールアイドルフェスティバル ALL STARS』を支えるビルドパイプライン 〜より安定したサービス提供を目指して〜『ラブライブ!スクールアイドルフェスティバル ALL STARS』を支えるビルドパイプライン 〜より安定したサービス提供を目指して〜
『ラブライブ!スクールアイドルフェスティバル ALL STARS』を支えるビルドパイプライン 〜より安定したサービス提供を目指して〜
 
新しいエフェクトツール、Niagaraを楽しもう! ~Niagara作例のブレイクダウン~
新しいエフェクトツール、Niagaraを楽しもう! ~Niagara作例のブレイクダウン~新しいエフェクトツール、Niagaraを楽しもう! ~Niagara作例のブレイクダウン~
新しいエフェクトツール、Niagaraを楽しもう! ~Niagara作例のブレイクダウン~
 
「スキルなし・実績なし」 32歳窓際エンジニアがシリコンバレーで働くようになるまで
「スキルなし・実績なし」 32歳窓際エンジニアがシリコンバレーで働くようになるまで「スキルなし・実績なし」 32歳窓際エンジニアがシリコンバレーで働くようになるまで
「スキルなし・実績なし」 32歳窓際エンジニアがシリコンバレーで働くようになるまで
 
UniRxでMV(R)Pパターン をやってみた
UniRxでMV(R)PパターンをやってみたUniRxでMV(R)Pパターンをやってみた
UniRxでMV(R)Pパターン をやってみた
 
世界を跨ぐリアルタイム PvP 対戦への挑戦 [Google Cloud INSIDE Games & Apps]
世界を跨ぐリアルタイム PvP 対戦への挑戦 [Google Cloud INSIDE Games & Apps]世界を跨ぐリアルタイム PvP 対戦への挑戦 [Google Cloud INSIDE Games & Apps]
世界を跨ぐリアルタイム PvP 対戦への挑戦 [Google Cloud INSIDE Games & Apps]
 
#CCSE2019 GREE VR Studio Lab 「VTuber向け特殊表情コントローラの可能性と機械学習的アプローチ」(速公開版)
#CCSE2019 GREE VR Studio Lab 「VTuber向け特殊表情コントローラの可能性と機械学習的アプローチ」(速公開版)#CCSE2019 GREE VR Studio Lab 「VTuber向け特殊表情コントローラの可能性と機械学習的アプローチ」(速公開版)
#CCSE2019 GREE VR Studio Lab 「VTuber向け特殊表情コントローラの可能性と機械学習的アプローチ」(速公開版)
 
組織の問題も解決するアーキテクチャ BackendsForFrontends
組織の問題も解決するアーキテクチャ BackendsForFrontends組織の問題も解決するアーキテクチャ BackendsForFrontends
組織の問題も解決するアーキテクチャ BackendsForFrontends
 
UE4 Hair & Groomでのリアルタイムファーレンダリング (UE4 Character Art Dive Online)
UE4 Hair & Groomでのリアルタイムファーレンダリング (UE4 Character Art Dive Online)UE4 Hair & Groomでのリアルタイムファーレンダリング (UE4 Character Art Dive Online)
UE4 Hair & Groomでのリアルタイムファーレンダリング (UE4 Character Art Dive Online)
 
インセプションデッキのひな形(PPT形式:ダウンロード用)
インセプションデッキのひな形(PPT形式:ダウンロード用)インセプションデッキのひな形(PPT形式:ダウンロード用)
インセプションデッキのひな形(PPT形式:ダウンロード用)
 

Similar to iOS WKWebViewの魔改造 - iOSDC 2018

[JavaOne Tokyo 2012] JavaFX and Web Integration
[JavaOne Tokyo 2012] JavaFX and Web Integration[JavaOne Tokyo 2012] JavaFX and Web Integration
[JavaOne Tokyo 2012] JavaFX and Web Integration
Kazuchika Sekiya
 
HTML5の前のJavaScript入門
HTML5の前のJavaScript入門HTML5の前のJavaScript入門
HTML5の前のJavaScript入門
Hiroki Toyokawa
 
iOS WebView App
iOS WebView AppiOS WebView App
iOS WebView App
hagino 3000
 
AngularJSの高速化
AngularJSの高速化AngularJSの高速化
AngularJSの高速化
Kon Yuichi
 
Veeam v12新機能セミナー!クラウドへの直接バックアップ、多要素認証など便利機能をまるっと解説
Veeam v12新機能セミナー!クラウドへの直接バックアップ、多要素認証など便利機能をまるっと解説Veeam v12新機能セミナー!クラウドへの直接バックアップ、多要素認証など便利機能をまるっと解説
Veeam v12新機能セミナー!クラウドへの直接バックアップ、多要素認証など便利機能をまるっと解説
株式会社クライム
 
OWIN って何?
OWIN って何?OWIN って何?
OWIN って何?
miso- soup3
 
iOS 8のWebKit Frameworkでアプリ内ブラウザがどう変わる?
iOS 8のWebKit Frameworkでアプリ内ブラウザがどう変わる?iOS 8のWebKit Frameworkでアプリ内ブラウザがどう変わる?
iOS 8のWebKit Frameworkでアプリ内ブラウザがどう変わる?
Kosuke Ogawa
 
サーバーからiOSアプリを変更する
サーバーからiOSアプリを変更するサーバーからiOSアプリを変更する
サーバーからiOSアプリを変更する
toyship
 
Service worker が拓く mobile web の新しいかたち
Service worker が拓く mobile web の新しいかたちService worker が拓く mobile web の新しいかたち
Service worker が拓く mobile web の新しいかたち
Kinuko Yasuda
 
Azure 高速サイトソリューション
Azure 高速サイトソリューションAzure 高速サイトソリューション
Azure 高速サイトソリューション
Hiromasa Oka
 
iOSでMVVM入門
iOSでMVVM入門iOSでMVVM入門
iOSでMVVM入門
ishikawa akira
 
XAML と C# を使った Windows ストアアプリ(LOB)構築のためのtips Prism 4.5 & Kona project 等のご紹介
XAML と C# を使った Windows ストアアプリ(LOB)構築のためのtips   Prism 4.5 & Kona project 等のご紹介XAML と C# を使った Windows ストアアプリ(LOB)構築のためのtips   Prism 4.5 & Kona project 等のご紹介
XAML と C# を使った Windows ストアアプリ(LOB)構築のためのtips Prism 4.5 & Kona project 等のご紹介Shotaro Suzuki
 
【de:code 2020】 「あつまれ フロントエンドエンジニア」 Azure Static Web Apps がやってきた
【de:code 2020】 「あつまれ フロントエンドエンジニア」 Azure Static Web Apps がやってきた【de:code 2020】 「あつまれ フロントエンドエンジニア」 Azure Static Web Apps がやってきた
【de:code 2020】 「あつまれ フロントエンドエンジニア」 Azure Static Web Apps がやってきた
日本マイクロソフト株式会社
 
WebIntentsにより拓かれる次のWeb
WebIntentsにより拓かれる次のWebWebIntentsにより拓かれる次のWeb
WebIntentsにより拓かれる次のWeb
Kensaku Komatsu
 
Springの今
Springの今Springの今
Springの今
Kazuyuki Kawamura
 
テスト
テストテスト
テスト
Masashi Sato
 
ここ最近のJenkins新機能
ここ最近のJenkins新機能ここ最近のJenkins新機能
ここ最近のJenkins新機能
Kohsuke Kawaguchi
 
Developer summit continuous deliveryとjenkins
Developer summit   continuous deliveryとjenkinsDeveloper summit   continuous deliveryとjenkins
Developer summit continuous deliveryとjenkins
Kohsuke Kawaguchi
 
誰にでもできるパフォーマンスチューニング
誰にでもできるパフォーマンスチューニング誰にでもできるパフォーマンスチューニング
誰にでもできるパフォーマンスチューニング
Kiyokazu Kaba
 
PhoneGapでWebアプリをスマホアプリ化
PhoneGapでWebアプリをスマホアプリ化PhoneGapでWebアプリをスマホアプリ化
PhoneGapでWebアプリをスマホアプリ化
Takashi Okamoto
 

Similar to iOS WKWebViewの魔改造 - iOSDC 2018 (20)

[JavaOne Tokyo 2012] JavaFX and Web Integration
[JavaOne Tokyo 2012] JavaFX and Web Integration[JavaOne Tokyo 2012] JavaFX and Web Integration
[JavaOne Tokyo 2012] JavaFX and Web Integration
 
HTML5の前のJavaScript入門
HTML5の前のJavaScript入門HTML5の前のJavaScript入門
HTML5の前のJavaScript入門
 
iOS WebView App
iOS WebView AppiOS WebView App
iOS WebView App
 
AngularJSの高速化
AngularJSの高速化AngularJSの高速化
AngularJSの高速化
 
Veeam v12新機能セミナー!クラウドへの直接バックアップ、多要素認証など便利機能をまるっと解説
Veeam v12新機能セミナー!クラウドへの直接バックアップ、多要素認証など便利機能をまるっと解説Veeam v12新機能セミナー!クラウドへの直接バックアップ、多要素認証など便利機能をまるっと解説
Veeam v12新機能セミナー!クラウドへの直接バックアップ、多要素認証など便利機能をまるっと解説
 
OWIN って何?
OWIN って何?OWIN って何?
OWIN って何?
 
iOS 8のWebKit Frameworkでアプリ内ブラウザがどう変わる?
iOS 8のWebKit Frameworkでアプリ内ブラウザがどう変わる?iOS 8のWebKit Frameworkでアプリ内ブラウザがどう変わる?
iOS 8のWebKit Frameworkでアプリ内ブラウザがどう変わる?
 
サーバーからiOSアプリを変更する
サーバーからiOSアプリを変更するサーバーからiOSアプリを変更する
サーバーからiOSアプリを変更する
 
Service worker が拓く mobile web の新しいかたち
Service worker が拓く mobile web の新しいかたちService worker が拓く mobile web の新しいかたち
Service worker が拓く mobile web の新しいかたち
 
Azure 高速サイトソリューション
Azure 高速サイトソリューションAzure 高速サイトソリューション
Azure 高速サイトソリューション
 
iOSでMVVM入門
iOSでMVVM入門iOSでMVVM入門
iOSでMVVM入門
 
XAML と C# を使った Windows ストアアプリ(LOB)構築のためのtips Prism 4.5 & Kona project 等のご紹介
XAML と C# を使った Windows ストアアプリ(LOB)構築のためのtips   Prism 4.5 & Kona project 等のご紹介XAML と C# を使った Windows ストアアプリ(LOB)構築のためのtips   Prism 4.5 & Kona project 等のご紹介
XAML と C# を使った Windows ストアアプリ(LOB)構築のためのtips Prism 4.5 & Kona project 等のご紹介
 
【de:code 2020】 「あつまれ フロントエンドエンジニア」 Azure Static Web Apps がやってきた
【de:code 2020】 「あつまれ フロントエンドエンジニア」 Azure Static Web Apps がやってきた【de:code 2020】 「あつまれ フロントエンドエンジニア」 Azure Static Web Apps がやってきた
【de:code 2020】 「あつまれ フロントエンドエンジニア」 Azure Static Web Apps がやってきた
 
WebIntentsにより拓かれる次のWeb
WebIntentsにより拓かれる次のWebWebIntentsにより拓かれる次のWeb
WebIntentsにより拓かれる次のWeb
 
Springの今
Springの今Springの今
Springの今
 
テスト
テストテスト
テスト
 
ここ最近のJenkins新機能
ここ最近のJenkins新機能ここ最近のJenkins新機能
ここ最近のJenkins新機能
 
Developer summit continuous deliveryとjenkins
Developer summit   continuous deliveryとjenkinsDeveloper summit   continuous deliveryとjenkins
Developer summit continuous deliveryとjenkins
 
誰にでもできるパフォーマンスチューニング
誰にでもできるパフォーマンスチューニング誰にでもできるパフォーマンスチューニング
誰にでもできるパフォーマンスチューニング
 
PhoneGapでWebアプリをスマホアプリ化
PhoneGapでWebアプリをスマホアプリ化PhoneGapでWebアプリをスマホアプリ化
PhoneGapでWebアプリをスマホアプリ化
 

Recently uploaded

FIDO Alliance Osaka Seminar: NEC & Yubico Panel.pdf
FIDO Alliance Osaka Seminar: NEC & Yubico Panel.pdfFIDO Alliance Osaka Seminar: NEC & Yubico Panel.pdf
FIDO Alliance Osaka Seminar: NEC & Yubico Panel.pdf
FIDO Alliance
 
JSAI_類似画像マッチングによる器への印象付与手法の妥当性検証_ver.3_高橋りさ
JSAI_類似画像マッチングによる器への印象付与手法の妥当性検証_ver.3_高橋りさJSAI_類似画像マッチングによる器への印象付与手法の妥当性検証_ver.3_高橋りさ
JSAI_類似画像マッチングによる器への印象付与手法の妥当性検証_ver.3_高橋りさ
0207sukipio
 
単腕マニピュレータによる 複数物体の同時組み立ての 基礎的考察 / Basic Approach to Robotic Assembly of Multi...
単腕マニピュレータによる 複数物体の同時組み立ての 基礎的考察 / Basic Approach to Robotic Assembly of Multi...単腕マニピュレータによる 複数物体の同時組み立ての 基礎的考察 / Basic Approach to Robotic Assembly of Multi...
単腕マニピュレータによる 複数物体の同時組み立ての 基礎的考察 / Basic Approach to Robotic Assembly of Multi...
Fukuoka Institute of Technology
 
FIDO Alliance Osaka Seminar: CloudGate.pdf
FIDO Alliance Osaka Seminar: CloudGate.pdfFIDO Alliance Osaka Seminar: CloudGate.pdf
FIDO Alliance Osaka Seminar: CloudGate.pdf
FIDO Alliance
 
ReonHata_便利の副作用に気づかせるための発想支援手法の評価---行為の増減の提示による気づきへの影響---
ReonHata_便利の副作用に気づかせるための発想支援手法の評価---行為の増減の提示による気づきへの影響---ReonHata_便利の副作用に気づかせるための発想支援手法の評価---行為の増減の提示による気づきへの影響---
ReonHata_便利の副作用に気づかせるための発想支援手法の評価---行為の増減の提示による気づきへの影響---
Matsushita Laboratory
 
【DLゼミ】XFeat: Accelerated Features for Lightweight Image Matching
【DLゼミ】XFeat: Accelerated Features for Lightweight Image Matching【DLゼミ】XFeat: Accelerated Features for Lightweight Image Matching
【DLゼミ】XFeat: Accelerated Features for Lightweight Image Matching
harmonylab
 
論文紹介:When Visual Prompt Tuning Meets Source-Free Domain Adaptive Semantic Seg...
論文紹介:When Visual Prompt Tuning Meets Source-Free Domain Adaptive Semantic Seg...論文紹介:When Visual Prompt Tuning Meets Source-Free Domain Adaptive Semantic Seg...
論文紹介:When Visual Prompt Tuning Meets Source-Free Domain Adaptive Semantic Seg...
Toru Tamaki
 
FIDO Alliance Osaka Seminar: Welcome Slides.pdf
FIDO Alliance Osaka Seminar: Welcome Slides.pdfFIDO Alliance Osaka Seminar: Welcome Slides.pdf
FIDO Alliance Osaka Seminar: Welcome Slides.pdf
FIDO Alliance
 
FIDO Alliance Osaka Seminar: LY-DOCOMO-KDDI-Mercari Panel.pdf
FIDO Alliance Osaka Seminar: LY-DOCOMO-KDDI-Mercari Panel.pdfFIDO Alliance Osaka Seminar: LY-DOCOMO-KDDI-Mercari Panel.pdf
FIDO Alliance Osaka Seminar: LY-DOCOMO-KDDI-Mercari Panel.pdf
FIDO Alliance
 
LoRaWAN 4チャンネル電流センサー・コンバーター CS01-LB 日本語マニュアル
LoRaWAN 4チャンネル電流センサー・コンバーター CS01-LB 日本語マニュアルLoRaWAN 4チャンネル電流センサー・コンバーター CS01-LB 日本語マニュアル
LoRaWAN 4チャンネル電流センサー・コンバーター CS01-LB 日本語マニュアル
CRI Japan, Inc.
 
TaketoFujikawa_物語のコンセプトに基づく情報アクセス手法の基礎検討_JSAI2024
TaketoFujikawa_物語のコンセプトに基づく情報アクセス手法の基礎検討_JSAI2024TaketoFujikawa_物語のコンセプトに基づく情報アクセス手法の基礎検討_JSAI2024
TaketoFujikawa_物語のコンセプトに基づく情報アクセス手法の基礎検討_JSAI2024
Matsushita Laboratory
 
This is the company presentation material of RIZAP Technologies, Inc.
This is the company presentation material of RIZAP Technologies, Inc.This is the company presentation material of RIZAP Technologies, Inc.
This is the company presentation material of RIZAP Technologies, Inc.
chiefujita1
 
FIDO Alliance Osaka Seminar: PlayStation Passkey Deployment Case Study.pdf
FIDO Alliance Osaka Seminar: PlayStation Passkey Deployment Case Study.pdfFIDO Alliance Osaka Seminar: PlayStation Passkey Deployment Case Study.pdf
FIDO Alliance Osaka Seminar: PlayStation Passkey Deployment Case Study.pdf
FIDO Alliance
 
CS集会#13_なるほどわからん通信技術 発表資料
CS集会#13_なるほどわからん通信技術 発表資料CS集会#13_なるほどわからん通信技術 発表資料
CS集会#13_なるほどわからん通信技術 発表資料
Yuuitirou528 default
 

Recently uploaded (14)

FIDO Alliance Osaka Seminar: NEC & Yubico Panel.pdf
FIDO Alliance Osaka Seminar: NEC & Yubico Panel.pdfFIDO Alliance Osaka Seminar: NEC & Yubico Panel.pdf
FIDO Alliance Osaka Seminar: NEC & Yubico Panel.pdf
 
JSAI_類似画像マッチングによる器への印象付与手法の妥当性検証_ver.3_高橋りさ
JSAI_類似画像マッチングによる器への印象付与手法の妥当性検証_ver.3_高橋りさJSAI_類似画像マッチングによる器への印象付与手法の妥当性検証_ver.3_高橋りさ
JSAI_類似画像マッチングによる器への印象付与手法の妥当性検証_ver.3_高橋りさ
 
単腕マニピュレータによる 複数物体の同時組み立ての 基礎的考察 / Basic Approach to Robotic Assembly of Multi...
単腕マニピュレータによる 複数物体の同時組み立ての 基礎的考察 / Basic Approach to Robotic Assembly of Multi...単腕マニピュレータによる 複数物体の同時組み立ての 基礎的考察 / Basic Approach to Robotic Assembly of Multi...
単腕マニピュレータによる 複数物体の同時組み立ての 基礎的考察 / Basic Approach to Robotic Assembly of Multi...
 
FIDO Alliance Osaka Seminar: CloudGate.pdf
FIDO Alliance Osaka Seminar: CloudGate.pdfFIDO Alliance Osaka Seminar: CloudGate.pdf
FIDO Alliance Osaka Seminar: CloudGate.pdf
 
ReonHata_便利の副作用に気づかせるための発想支援手法の評価---行為の増減の提示による気づきへの影響---
ReonHata_便利の副作用に気づかせるための発想支援手法の評価---行為の増減の提示による気づきへの影響---ReonHata_便利の副作用に気づかせるための発想支援手法の評価---行為の増減の提示による気づきへの影響---
ReonHata_便利の副作用に気づかせるための発想支援手法の評価---行為の増減の提示による気づきへの影響---
 
【DLゼミ】XFeat: Accelerated Features for Lightweight Image Matching
【DLゼミ】XFeat: Accelerated Features for Lightweight Image Matching【DLゼミ】XFeat: Accelerated Features for Lightweight Image Matching
【DLゼミ】XFeat: Accelerated Features for Lightweight Image Matching
 
論文紹介:When Visual Prompt Tuning Meets Source-Free Domain Adaptive Semantic Seg...
論文紹介:When Visual Prompt Tuning Meets Source-Free Domain Adaptive Semantic Seg...論文紹介:When Visual Prompt Tuning Meets Source-Free Domain Adaptive Semantic Seg...
論文紹介:When Visual Prompt Tuning Meets Source-Free Domain Adaptive Semantic Seg...
 
FIDO Alliance Osaka Seminar: Welcome Slides.pdf
FIDO Alliance Osaka Seminar: Welcome Slides.pdfFIDO Alliance Osaka Seminar: Welcome Slides.pdf
FIDO Alliance Osaka Seminar: Welcome Slides.pdf
 
FIDO Alliance Osaka Seminar: LY-DOCOMO-KDDI-Mercari Panel.pdf
FIDO Alliance Osaka Seminar: LY-DOCOMO-KDDI-Mercari Panel.pdfFIDO Alliance Osaka Seminar: LY-DOCOMO-KDDI-Mercari Panel.pdf
FIDO Alliance Osaka Seminar: LY-DOCOMO-KDDI-Mercari Panel.pdf
 
LoRaWAN 4チャンネル電流センサー・コンバーター CS01-LB 日本語マニュアル
LoRaWAN 4チャンネル電流センサー・コンバーター CS01-LB 日本語マニュアルLoRaWAN 4チャンネル電流センサー・コンバーター CS01-LB 日本語マニュアル
LoRaWAN 4チャンネル電流センサー・コンバーター CS01-LB 日本語マニュアル
 
TaketoFujikawa_物語のコンセプトに基づく情報アクセス手法の基礎検討_JSAI2024
TaketoFujikawa_物語のコンセプトに基づく情報アクセス手法の基礎検討_JSAI2024TaketoFujikawa_物語のコンセプトに基づく情報アクセス手法の基礎検討_JSAI2024
TaketoFujikawa_物語のコンセプトに基づく情報アクセス手法の基礎検討_JSAI2024
 
This is the company presentation material of RIZAP Technologies, Inc.
This is the company presentation material of RIZAP Technologies, Inc.This is the company presentation material of RIZAP Technologies, Inc.
This is the company presentation material of RIZAP Technologies, Inc.
 
FIDO Alliance Osaka Seminar: PlayStation Passkey Deployment Case Study.pdf
FIDO Alliance Osaka Seminar: PlayStation Passkey Deployment Case Study.pdfFIDO Alliance Osaka Seminar: PlayStation Passkey Deployment Case Study.pdf
FIDO Alliance Osaka Seminar: PlayStation Passkey Deployment Case Study.pdf
 
CS集会#13_なるほどわからん通信技術 発表資料
CS集会#13_なるほどわからん通信技術 発表資料CS集会#13_なるほどわからん通信技術 発表資料
CS集会#13_なるほどわからん通信技術 発表資料
 

iOS WKWebViewの魔改造 - iOSDC 2018

Editor's Notes

  1. WKWebViewの魔改造というタイトルで話します。 自己紹介
  2. 福山慎吾といいます。 IOSDCに参加するのは2回目ですが、 こういう場で話すことは初めてなのでよろしくお願いします。
  3. 今は楽天でROOMというアプリの開発に携わっています。 これは楽天市場のショッピングSNSです。 欲しいものや、購入したものを投稿をして それを見たほかの人がその商品を購入すると、投稿した人も買った人も楽天ポイントがもらえるというアプリです。 最近Texture 旧名AsyncDisplayKitを導入し始めたので、現時点ではメイン画面だけスクロールがぬるぬる動くと思います。よかったら試してみてください。 今回、話す内容はこのアプリではなく、
  4. このアプリ。 2014年からiOSのWebブラウザアプリを趣味で作っています。 ちょうどこのとき、iOS 8でWKWebViewも公開されました。 当時のWKWebViewはできないことばかりで、たいへん苦労しました。 今回はその中で、今でも使えるWKWebViewの技術を紹介します。
  5. 内容はこちら 高速DOM、Document Object Model 操作。 これによってリアルタイムにコンテンツブロックやスタイル操作を行えるようになります。 WKWebView内の動画をカスタマイズしたAVPlayerでバックグラウンド再生できるようにします。これに関してはサンプルアプリも後ほど公開します。 WKWebView内部のジェスチャへのアクセスと操作。 あることをするとWKWebView内にある独自のUIGestureRecognizerを扱えるようになります。 そして最後に少し、JavaScriptからSwiftへの通知で役立ちそうなサンプルを紹介します。
  6. WKWebView ここ最近、再びWKWebViewが注目され始めました。 なんでだと思いますか? それは、、、
  7. UIWebView. iOSがまだiPhone OSと呼ばれていた時代、 2008年から10年も存在し続けているAPIです。 それがこのたび iOS 12で、
  8. 公式に非推奨・廃止予定となりました。 今までは非推奨となってはいなかったものの、AppleからもWKWebViewへ移行するように促すドキュメントも見られました。 [アンケート] 興味本位に少し聞いてみたいんですけど、 この会場の中で、今取り組んでいるプロジェクトでUIWebViewを使っている、 または移行中というかた。少し手を上げていただけますでしょうか? Result: more than 30%
  9. 次にWKWebViewとUIWebViewとの比較を簡単に紹介します。 レンダリング速度、JavaScriptの実行速度が高速化されています。 アプリ自体とWKWebView、ネットワーク処理はそれぞれ別のプロセスで動作しているため、どれかにセキュリティ問題が生じても全てに影響しにくくなっています。 プロセスが分離されているため、WKWebViewのプロセスがクラッシュしたとしても、アプリ自体はクラッシュしません。 iOS Google ChromeがUIWebViewからWKWebViewへ移行した際にクラッシュ率が70%減少したという記事もあります。
  10. では、SwiftとJavaScriptを使ってゴリゴリしていきます。 SwiftからWKWebViewへJavaScriptを注入する方法の一つに evaluateJavaScript:completionHandler: というメソッドもありますが、今回は別の方法を使います。
  11. Webページのコンテンツ読み込み前、もしくは読み込み後に毎回自動でJavaScriptを実行する WKUserScriptを使います。 コードはこんな感じで WKWebViewConfigurationで設定します。
  12. 注入のタイミングは2パターン。 Documentが読み込まれた後でかつコンテンツの読み込み前。 コンテンツの読み込み後かつ画像などのサブリソースのロード前です。
  13. ここで何を実行するのか。 それがこれから紹介するもの。 WKWebViewと組み合わせると強力でいろいろできるJavaScript APIがあります。 それが、
  14. Mutation Observerというものです。 このAPIはDOMの変更を監視するものです。 通常のWebページで使われることは稀かれもしれませんが、 不特定多数のWebページを扱うWebブラウザで力を発揮します。
  15. このように設定ができ、DOM変更に加えて、特定のattributes変更のみを監視することもできます。 Documentを監視対象にすることで<html>タグを含む全ての変更を監視できます。
  16. 変更結果はリアルタイムに配列として帰ってきます。 ここで特定の要素をフィルターして、変更を加えていきます。 モダンなJavaScriptの書き方には、 キャッチアップしていないので勘弁してください。
  17. WKWebViewとMutation Observerを組み合わせることで得られるメリットは、
  18. DOM要素の変更、削除、非表示、置換などをレンダリングの前に行えます。
  19. そして、要素がDOMツリーに追加された直後に JavaScript APIのEventListenerを追加でき、 イベントを監視することができます。
  20. ベンチマークを取ったわけではありませんが、 すべてのDOM要素を監視・非同期操作してもパフォーマンスに大きな影響は見られませんでした。 同期操作では重たくなるので非同期 setTimeout、最近ではPromiseでしょうか。 を使います。
  21. WKWebViewとMutationObserverの活用例
  22. iOS 11でコンテンツブロックがWKWebViewにも導入されましたが、 それより前のiOSでも有効な手法です。 もちろんiOS 11のコンテンツブロックと組み合わせることでより強力なコンテンツブロックが可能になります。
  23. レンダリングの前にスタイルを操作できるため、 ユーザーから見てもスタイルが変わる瞬間に気づくことはありません。
  24. そしてEventListenerを追加してイベントの即時監視ができます。 これは次に話すことに関連してきます。
  25. WKWebView内動画のバックグラウンド再生方法について話します。
  26. 通常WKWebView内で動画を再生すると、アプリ起動中のみ再生を行えます。 一方
  27. AVKitのAVPlayerでは
  28. ホーム画面、 ほかアプリ使用中、 デバイスロック中 に動画の音声が継続して再生できます。 さらにiPadではPIP、Picture in Pictureを使って 動画をホーム画面や他のアプリにいるときでも小窓で再生することが可能です。
  29. AVPlayerで再生できればなんでもできそうです。 単純にWKWebViewの動画からURLをぽんっと渡せば良さそうですが、 通常の動画サイトはなんらかの対策をとっており、そうはさせてくれません。
  30. 動画URLの取得
  31. src属性にあるURLをコピーすれば良さそうですが、
  32. これは通常ダミーファイルもしくは空となっています。 しかし、本物の動画URLが現れる瞬間があります。
  33. それがplayイベント発火時です。 このときのURLをSwift側のAVPlayerへ渡します。 ちなみにAndroidのWebViewはBlob URLでの再生に対応しており、 この方法ではうまくいきません。 そのまえに、
  34. WKWebViewのデフォルトプレイヤーが出てくるのを防ぐ必要があります。 WKWebViewConfigurationには allowsInlineMediaPlaybackというプロパティがあり、 初期値はiPhoneではfalse、iPadではtrueとなっています。 この値をtrueにして、インライン再生の設定を行えば、全画面化することなくWebページの上で再生できます。 iOS 10より前への対応は<video>タグにwebkit-playsinlineという属性をつけると大丈夫です。 再生を開始した<video>タグは用済みなので即座に停止させます。
  35. WKWebView内の動画バックグラウンド再生 のまとめ
  36. Mutation Observerで<video>タグ追加時に捕まえる
  37. EventListenerで<video>タグのplayイベントを監視する
  38. WKScriptMessageHandlerで本物の動画URLをSwift側へ通知する
  39. デフォルトプレイヤーの起動を阻止し、バックグラウンド再生やPIPの設定をしたAVPlayerで再生 サンプルアプリは後で公開します。
  40. WKWebView内ジェスチャの操作
  41. ->
  42. まず、呼び水としてWKWebViewにpanジェスチャをつけます。
  43. UIGestureRecognizerDelegate gestureRecognizer(_:shouldRecognizeSimultaneouslyWith:) で取り出します。 呼び水にしたジェスチャと衝突した他のWKWebView内ジェスチャがここで姿を現します。
  44. WKWebView自体にpanジェスチャをつける
  45. UIGestureRecognizerDelegateで取り出す。 そうすると、次のようなジェスチャが網にかかります。
  46. 見慣れないものばかりですね。 これらは私達が普段使うジェスチャのサブクラスだったりするので、 親クラスにキャストすることで扱うことができます。 無効にしたり、プロパティをいじったり、特定のジェスチャをなにかの目印にするのもいいと思います。
  47. 活用例です。 特定のLongPressGestureを捕まえて WKWebView内リンクの長押し時間を変更したり、
  48. WKWebView上のスクロール可能領域を操作中かどうかを判定できます。
  49. 次はWKScriptMessageHandlerの活用例を紹介します。 SwiftやObjective-Cで言うところの黒魔術のJavaScript版です。 WKScriptMessageHandlerはJavaScriptからSwiftへ通知を行うものです。
  50. Document.cookieにgetterとsetterを生やします。 もともとの機能は保たれており、 Cookieが追加された瞬間にSwift側へ値とともに通知する仕組みです。 Cookieに限らず様々なJavaScriptのプロパティを監視できるようになります。
  51. Ajax通信リクエストの監視、すり替え XMLHttpRequestをオーバーライドする形で 既存の働きの前にURLフィルタをかけ、ブロックしたい通信をすり替えています。
  52. 最後に こちらが動画再生のサンプルアプリです。 [時間があればデモ] [PR]