SlideShare a Scribd company logo
1 of 53
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

こわくない Git
こわくない Gitこわくない Git
こわくない GitKota Saito
 
Concourseで快適な自動化の旅
Concourseで快適な自動化の旅Concourseで快適な自動化の旅
Concourseで快適な自動化の旅Kazuto Kusama
 
DI(依存性注入)について
DI(依存性注入)についてDI(依存性注入)について
DI(依存性注入)についてYui Ito
 
知っておきたいFirebase の色んな上限について
知っておきたいFirebase の色んな上限について知っておきたいFirebase の色んな上限について
知っておきたいFirebase の色んな上限について健一 辰濱
 
なぜ人は必死でjQueryを捨てようとしているのか
なぜ人は必死でjQueryを捨てようとしているのかなぜ人は必死でjQueryを捨てようとしているのか
なぜ人は必死でjQueryを捨てようとしているのかYoichi Toyota
 
がんばらなくても C# で Single Page Web アプリケーションが書けてしまう「Blazor」とは
がんばらなくても C# で Single Page Web アプリケーションが書けてしまう「Blazor」とはがんばらなくても C# で Single Page Web アプリケーションが書けてしまう「Blazor」とは
がんばらなくても C# で Single Page Web アプリケーションが書けてしまう「Blazor」とはJun-ichi Sakamoto
 
オブジェクト指向プログラミングのためのモデリング入門
オブジェクト指向プログラミングのためのモデリング入門オブジェクト指向プログラミングのためのモデリング入門
オブジェクト指向プログラミングのためのモデリング入門増田 亨
 
それはYAGNIか? それとも思考停止か?
それはYAGNIか? それとも思考停止か?それはYAGNIか? それとも思考停止か?
それはYAGNIか? それとも思考停止か?Yoshitaka Kawashima
 
5分で出来る!イケてるconfluenceページ
5分で出来る!イケてるconfluenceページ5分で出来る!イケてるconfluenceページ
5分で出来る!イケてるconfluenceページCLARA ONLINE, Inc.
 
組み合わせテストの落とし穴〜有則と無則〜
組み合わせテストの落とし穴〜有則と無則〜組み合わせテストの落とし穴〜有則と無則〜
組み合わせテストの落とし穴〜有則と無則〜yufu yufu
 
Unityでパフォーマンスの良いUIを作る為のTips
Unityでパフォーマンスの良いUIを作る為のTipsUnityでパフォーマンスの良いUIを作る為のTips
Unityでパフォーマンスの良いUIを作る為のTipsUnity Technologies Japan K.K.
 
モジュールの凝集度・結合度・インタフェース
モジュールの凝集度・結合度・インタフェースモジュールの凝集度・結合度・インタフェース
モジュールの凝集度・結合度・インタフェースHajime Yanagawa
 
やはりお前らのMVCは間違っている
やはりお前らのMVCは間違っているやはりお前らのMVCは間違っている
やはりお前らのMVCは間違っているKoichi Tanaka
 
webSocket通信を知らないiOSエンジニアが知っておいて損はしない(経験談的な)軽い話
webSocket通信を知らないiOSエンジニアが知っておいて損はしない(経験談的な)軽い話webSocket通信を知らないiOSエンジニアが知っておいて損はしない(経験談的な)軽い話
webSocket通信を知らないiOSエンジニアが知っておいて損はしない(経験談的な)軽い話Yuhei Miyazato
 
OpenID ConnectとAndroidアプリのログインサイクル
OpenID ConnectとAndroidアプリのログインサイクルOpenID ConnectとAndroidアプリのログインサイクル
OpenID ConnectとAndroidアプリのログインサイクルMasaru Kurahayashi
 
쿠키런 1년, 서버개발 분투기
쿠키런 1년, 서버개발 분투기쿠키런 1년, 서버개발 분투기
쿠키런 1년, 서버개발 분투기Brian Hong
 
CEDEC2021 Android iOS 実機上での自動テストをより楽に有意義にする為に ~端末管理・イメージ転送・動画記録等の周辺情報のノウハウ共有~
CEDEC2021 Android iOS 実機上での自動テストをより楽に有意義にする為に ~端末管理・イメージ転送・動画記録等の周辺情報のノウハウ共有~CEDEC2021 Android iOS 実機上での自動テストをより楽に有意義にする為に ~端末管理・イメージ転送・動画記録等の周辺情報のノウハウ共有~
CEDEC2021 Android iOS 実機上での自動テストをより楽に有意義にする為に ~端末管理・イメージ転送・動画記録等の周辺情報のノウハウ共有~SEGADevTech
 
トランクベース開発を活用して爆速に開発した話
トランクベース開発を活用して爆速に開発した話トランクベース開発を活用して爆速に開発した話
トランクベース開発を活用して爆速に開発した話Tier_IV
 
「のどが渇いた」というユーザーに何を出す? ユーザーの「欲しい」に惑わされない、本当のインサイトを見つけるUXデザイン・UXリサーチ
「のどが渇いた」というユーザーに何を出す? ユーザーの「欲しい」に惑わされない、本当のインサイトを見つけるUXデザイン・UXリサーチ「のどが渇いた」というユーザーに何を出す? ユーザーの「欲しい」に惑わされない、本当のインサイトを見つけるUXデザイン・UXリサーチ
「のどが渇いた」というユーザーに何を出す? ユーザーの「欲しい」に惑わされない、本当のインサイトを見つけるUXデザイン・UXリサーチYoshiki Hayama
 

What's hot (20)

こわくない Git
こわくない Gitこわくない Git
こわくない Git
 
Concourseで快適な自動化の旅
Concourseで快適な自動化の旅Concourseで快適な自動化の旅
Concourseで快適な自動化の旅
 
DI(依存性注入)について
DI(依存性注入)についてDI(依存性注入)について
DI(依存性注入)について
 
知っておきたいFirebase の色んな上限について
知っておきたいFirebase の色んな上限について知っておきたいFirebase の色んな上限について
知っておきたいFirebase の色んな上限について
 
なぜ人は必死でjQueryを捨てようとしているのか
なぜ人は必死でjQueryを捨てようとしているのかなぜ人は必死でjQueryを捨てようとしているのか
なぜ人は必死でjQueryを捨てようとしているのか
 
がんばらなくても C# で Single Page Web アプリケーションが書けてしまう「Blazor」とは
がんばらなくても C# で Single Page Web アプリケーションが書けてしまう「Blazor」とはがんばらなくても C# で Single Page Web アプリケーションが書けてしまう「Blazor」とは
がんばらなくても C# で Single Page Web アプリケーションが書けてしまう「Blazor」とは
 
オブジェクト指向プログラミングのためのモデリング入門
オブジェクト指向プログラミングのためのモデリング入門オブジェクト指向プログラミングのためのモデリング入門
オブジェクト指向プログラミングのためのモデリング入門
 
それはYAGNIか? それとも思考停止か?
それはYAGNIか? それとも思考停止か?それはYAGNIか? それとも思考停止か?
それはYAGNIか? それとも思考停止か?
 
5分で出来る!イケてるconfluenceページ
5分で出来る!イケてるconfluenceページ5分で出来る!イケてるconfluenceページ
5分で出来る!イケてるconfluenceページ
 
組み合わせテストの落とし穴〜有則と無則〜
組み合わせテストの落とし穴〜有則と無則〜組み合わせテストの落とし穴〜有則と無則〜
組み合わせテストの落とし穴〜有則と無則〜
 
Unityでパフォーマンスの良いUIを作る為のTips
Unityでパフォーマンスの良いUIを作る為のTipsUnityでパフォーマンスの良いUIを作る為のTips
Unityでパフォーマンスの良いUIを作る為のTips
 
モジュールの凝集度・結合度・インタフェース
モジュールの凝集度・結合度・インタフェースモジュールの凝集度・結合度・インタフェース
モジュールの凝集度・結合度・インタフェース
 
やはりお前らのMVCは間違っている
やはりお前らのMVCは間違っているやはりお前らのMVCは間違っている
やはりお前らのMVCは間違っている
 
webSocket通信を知らないiOSエンジニアが知っておいて損はしない(経験談的な)軽い話
webSocket通信を知らないiOSエンジニアが知っておいて損はしない(経験談的な)軽い話webSocket通信を知らないiOSエンジニアが知っておいて損はしない(経験談的な)軽い話
webSocket通信を知らないiOSエンジニアが知っておいて損はしない(経験談的な)軽い話
 
OpenID ConnectとAndroidアプリのログインサイクル
OpenID ConnectとAndroidアプリのログインサイクルOpenID ConnectとAndroidアプリのログインサイクル
OpenID ConnectとAndroidアプリのログインサイクル
 
쿠키런 1년, 서버개발 분투기
쿠키런 1년, 서버개발 분투기쿠키런 1년, 서버개발 분투기
쿠키런 1년, 서버개발 분투기
 
CEDEC2021 Android iOS 実機上での自動テストをより楽に有意義にする為に ~端末管理・イメージ転送・動画記録等の周辺情報のノウハウ共有~
CEDEC2021 Android iOS 実機上での自動テストをより楽に有意義にする為に ~端末管理・イメージ転送・動画記録等の周辺情報のノウハウ共有~CEDEC2021 Android iOS 実機上での自動テストをより楽に有意義にする為に ~端末管理・イメージ転送・動画記録等の周辺情報のノウハウ共有~
CEDEC2021 Android iOS 実機上での自動テストをより楽に有意義にする為に ~端末管理・イメージ転送・動画記録等の周辺情報のノウハウ共有~
 
アプリのバックグラウンド処理 | iOS 7エンジニア勉強会
アプリのバックグラウンド処理 | iOS 7エンジニア勉強会アプリのバックグラウンド処理 | iOS 7エンジニア勉強会
アプリのバックグラウンド処理 | iOS 7エンジニア勉強会
 
トランクベース開発を活用して爆速に開発した話
トランクベース開発を活用して爆速に開発した話トランクベース開発を活用して爆速に開発した話
トランクベース開発を活用して爆速に開発した話
 
「のどが渇いた」というユーザーに何を出す? ユーザーの「欲しい」に惑わされない、本当のインサイトを見つけるUXデザイン・UXリサーチ
「のどが渇いた」というユーザーに何を出す? ユーザーの「欲しい」に惑わされない、本当のインサイトを見つけるUXデザイン・UXリサーチ「のどが渇いた」というユーザーに何を出す? ユーザーの「欲しい」に惑わされない、本当のインサイトを見つけるUXデザイン・UXリサーチ
「のどが渇いた」というユーザーに何を出す? ユーザーの「欲しい」に惑わされない、本当のインサイトを見つけるUXデザイン・UXリサーチ
 

Similar to iOS WKWebViewの魔改造 - iOSDC 2018

WKWebViewとUIWebView
WKWebViewとUIWebViewWKWebViewとUIWebView
WKWebViewとUIWebViewYuki Hirai
 
[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 IntegrationKazuchika Sekiya
 
HTML5の前のJavaScript入門
HTML5の前のJavaScript入門HTML5の前のJavaScript入門
HTML5の前のJavaScript入門Hiroki Toyokawa
 
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
 
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により拓かれる次のWebKensaku Komatsu
 
ここ最近のJenkins新機能
ここ最近のJenkins新機能ここ最近のJenkins新機能
ここ最近のJenkins新機能Kohsuke Kawaguchi
 
Developer summit continuous deliveryとjenkins
Developer summit   continuous deliveryとjenkinsDeveloper summit   continuous deliveryとjenkins
Developer summit continuous deliveryとjenkinsKohsuke Kawaguchi
 
誰にでもできるパフォーマンスチューニング
誰にでもできるパフォーマンスチューニング誰にでもできるパフォーマンスチューニング
誰にでもできるパフォーマンスチューニングKiyokazu Kaba
 

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

WKWebViewとUIWebView
WKWebViewとUIWebViewWKWebViewとUIWebView
WKWebViewとUIWebView
 
[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
 
誰にでもできるパフォーマンスチューニング
誰にでもできるパフォーマンスチューニング誰にでもできるパフォーマンスチューニング
誰にでもできるパフォーマンスチューニング
 

Recently uploaded

論文紹介:Content-Aware Token Sharing for Efficient Semantic Segmentation With Vis...
論文紹介:Content-Aware Token Sharing for Efficient Semantic Segmentation With Vis...論文紹介:Content-Aware Token Sharing for Efficient Semantic Segmentation With Vis...
論文紹介:Content-Aware Token Sharing for Efficient Semantic Segmentation With Vis...Toru Tamaki
 
SOPを理解する 2024/04/19 の勉強会で発表されたものです
SOPを理解する       2024/04/19 の勉強会で発表されたものですSOPを理解する       2024/04/19 の勉強会で発表されたものです
SOPを理解する 2024/04/19 の勉強会で発表されたものですiPride Co., Ltd.
 
Open Source UN-Conference 2024 Kawagoe - 独自OS「DaisyOS GB」の紹介
Open Source UN-Conference 2024 Kawagoe - 独自OS「DaisyOS GB」の紹介Open Source UN-Conference 2024 Kawagoe - 独自OS「DaisyOS GB」の紹介
Open Source UN-Conference 2024 Kawagoe - 独自OS「DaisyOS GB」の紹介Yuma Ohgami
 
論文紹介:Automated Classification of Model Errors on ImageNet
論文紹介:Automated Classification of Model Errors on ImageNet論文紹介:Automated Classification of Model Errors on ImageNet
論文紹介:Automated Classification of Model Errors on ImageNetToru Tamaki
 
論文紹介:Semantic segmentation using Vision Transformers: A survey
論文紹介:Semantic segmentation using Vision Transformers: A survey論文紹介:Semantic segmentation using Vision Transformers: A survey
論文紹介:Semantic segmentation using Vision Transformers: A surveyToru Tamaki
 
【早稲田AI研究会 講義資料】3DスキャンとTextTo3Dのツールを知ろう!(Vol.1)
【早稲田AI研究会 講義資料】3DスキャンとTextTo3Dのツールを知ろう!(Vol.1)【早稲田AI研究会 講義資料】3DスキャンとTextTo3Dのツールを知ろう!(Vol.1)
【早稲田AI研究会 講義資料】3DスキャンとTextTo3Dのツールを知ろう!(Vol.1)Hiroki Ichikura
 
TataPixel: 畳の異方性を利用した切り替え可能なディスプレイの提案
TataPixel: 畳の異方性を利用した切り替え可能なディスプレイの提案TataPixel: 畳の異方性を利用した切り替え可能なディスプレイの提案
TataPixel: 畳の異方性を利用した切り替え可能なディスプレイの提案sugiuralab
 
TSAL operation mechanism and circuit diagram.pdf
TSAL operation mechanism and circuit diagram.pdfTSAL operation mechanism and circuit diagram.pdf
TSAL operation mechanism and circuit diagram.pdftaisei2219
 

Recently uploaded (8)

論文紹介:Content-Aware Token Sharing for Efficient Semantic Segmentation With Vis...
論文紹介:Content-Aware Token Sharing for Efficient Semantic Segmentation With Vis...論文紹介:Content-Aware Token Sharing for Efficient Semantic Segmentation With Vis...
論文紹介:Content-Aware Token Sharing for Efficient Semantic Segmentation With Vis...
 
SOPを理解する 2024/04/19 の勉強会で発表されたものです
SOPを理解する       2024/04/19 の勉強会で発表されたものですSOPを理解する       2024/04/19 の勉強会で発表されたものです
SOPを理解する 2024/04/19 の勉強会で発表されたものです
 
Open Source UN-Conference 2024 Kawagoe - 独自OS「DaisyOS GB」の紹介
Open Source UN-Conference 2024 Kawagoe - 独自OS「DaisyOS GB」の紹介Open Source UN-Conference 2024 Kawagoe - 独自OS「DaisyOS GB」の紹介
Open Source UN-Conference 2024 Kawagoe - 独自OS「DaisyOS GB」の紹介
 
論文紹介:Automated Classification of Model Errors on ImageNet
論文紹介:Automated Classification of Model Errors on ImageNet論文紹介:Automated Classification of Model Errors on ImageNet
論文紹介:Automated Classification of Model Errors on ImageNet
 
論文紹介:Semantic segmentation using Vision Transformers: A survey
論文紹介:Semantic segmentation using Vision Transformers: A survey論文紹介:Semantic segmentation using Vision Transformers: A survey
論文紹介:Semantic segmentation using Vision Transformers: A survey
 
【早稲田AI研究会 講義資料】3DスキャンとTextTo3Dのツールを知ろう!(Vol.1)
【早稲田AI研究会 講義資料】3DスキャンとTextTo3Dのツールを知ろう!(Vol.1)【早稲田AI研究会 講義資料】3DスキャンとTextTo3Dのツールを知ろう!(Vol.1)
【早稲田AI研究会 講義資料】3DスキャンとTextTo3Dのツールを知ろう!(Vol.1)
 
TataPixel: 畳の異方性を利用した切り替え可能なディスプレイの提案
TataPixel: 畳の異方性を利用した切り替え可能なディスプレイの提案TataPixel: 畳の異方性を利用した切り替え可能なディスプレイの提案
TataPixel: 畳の異方性を利用した切り替え可能なディスプレイの提案
 
TSAL operation mechanism and circuit diagram.pdf
TSAL operation mechanism and circuit diagram.pdfTSAL operation mechanism and circuit diagram.pdf
TSAL operation mechanism and circuit diagram.pdf
 

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]