SlideShare a Scribd company logo
1 of 23
WKWebViewのキャッシュ
について調べた
potatotips #44
自己紹介
● Twitter
○ hotpepsi
● 趣味
○ 競技プログラミング、ピアノ、テニス、ボルダリング
● ライフワーク
○ デバッグ
● 勤務先
Agenda
● 調査のきっかけ、方法、結果
● OSバージョン毎の比較
● まとめ
調査のきっかけ
● iOS 10で、一部のユーザーのアプリの使用容量が数GBに
● WKWebViewのキャッシュが原因
調査対象
● WKWebViewが保持するデータ
○ コンテンツ(blobs)
■ HTMLや画像、動画データ
○ コンテンツ以外のデータ
■ cookies、local storageなど
● 今回はコンテンツ(blobs)の肥大化が調査対象
調査方法
● 実機
● シミュレータ
● ソースコード
実機とシミュレータでの調査方法
● アプリを用意する
○ 既存のアプリを改造し、数秒ごとにランダムでwebページ
を開く
■ 比較のため、WKWebViewとUIWebViewで試す
○ WKWebViewだけの単純なアプリを作る
● アプリバージョンやOSバージョン毎に内容を比較する
実機のデータ
● アプリのデータをMacに転送する
○ XcodeのDevices and Simulators -> Download Container
○ xcappdataを右クリック -> パッケージの内容を表示
シミュレータのデータ
● ディレクトリの内容を調べる
○ Macでの場所はNSSearchPathForDirectoriesInDomainsな
どを出力させればわかる
○ ~//Library/Developer/CoreSimulator/Devices/
● WKWebViewに関しては、ディレクトリの構成(位置)が実機と
異なるため、今回は参考にならなかった
ソースコード
● https://opensource.apple.com/
○ tar.gzアーカイブをダウンロードしてgrepする
● 該当部分はWebKit2
○ UI process、web process、network processなど、複数の
プロセスからなる、WebKitのAPI層
○ キャッシュを操作するのはnetwork process
OSバージョン毎の比較
● iOS 7 - WKWebViewは存在しない
● iOS 8
● iOS 9
● iOS 10
● iOS 11
iOS 8のWKWebViewのキャッシュ
● コンテンツ(blobs)はNSURLCacheを利用して格納される
○ NSURLCacheを消せば消える
● コンテンツ以外のデータ(cookiesなど)は別のフォルダにある
○ この部分を消すAPIは存在しない
● 最大容量はNSURLCacheに従うため、肥大化しない
iOS 9のWKWebViewのキャッシュ
● WKWebsiteDataStoreが導入された
○ API経由で消すこともできる
● NSURLCacheには書き込まない
○ 最大容量をゼロに設定している模様
● 試した限りでは肥大化しない
iOS 9のWKWebsiteDataStoreのコンテンツ部分
● 定期的に使用容量を確認している
○ Statistics::shrinkIfNeeded()
■ 100000個で消去
○ Storage::shrinkIfNeeded()
■ 最大容量を超えたら消去
● 最大容量の最大値は175MB
iOS 10のWKWebViewのキャッシュ
● APIや実装は、ほぼiOS 9のものと同じ
● しかしiOS 10ではどんどん肥大化していく
● ソースを追ってみたが調べきれず
● 肥大化するのはおそらくバグ
iOS 10のWKWebViewのキャッシュの問題点
● OSの問題
● WKWebsiteDataStoreの問題
iOS 10とキャッシュ
● WKWebsiteDataStoreはアプリに所属し、アプリのキャッシュ
領域に作成される
● キャッシュ領域もアプリの使用容量に含まれる
● キャッシュは、デバイス全体の容量が足りなくなるとOSが削
除するはずだが、ユーザーからはアプリが占有しているように
見える
iOS 10のWKWebsiteDataStoreの問題点
● 自動的に消えず、肥大化する
● APIが貧弱
○ 総容量の制限ができない、総容量がわからない
○ 古いコンテンツ(指定日時以前)だけを消すAPIがない
■ 全部または新しいコンテンツ(指定日時以降)は消せる
余談: iOS 10のUIWebView
● UIWebViewはNSURLCacheを使う
● 10.0、10.1、10.2は容量制限がなく、無尽蔵に増える
● 10.3では修正されている
Bug Reporterで報告
● 以下を報告
○ アプリの使用サイズが肥大化する
● 追記の要望として以下も書いておいた
○ 古いキャッシュを消すAPIがほしい
○ 最大のサイズを指定できるようにしてほしい
WWDCで開発者と話す
● アプリの使用サイズが肥大化することを説明
● 要望を伝えた
○ 古いのを消すAPIを追加できないか?
■ 「blobs以外も一貫性を保とうとすると難しい」
○ キャッシュ領域をアプリ領域から除外できないか?
■ それはもっともなので、検討したい
iOS 11のWKWebViewのキャッシュ
● OSの重要な変更
○ キャッシュがアプリの使用サイズに含まれなくなった
まとめ
● 同じAPIでも、内部実装や挙動が変わることがある
● Appleはちゃんとソースコードを公開している
● iOS 11は良い

More Related Content

What's hot

DeNA_Techcon2017_DeNAでのチート・脆弱性診断への取り組み
DeNA_Techcon2017_DeNAでのチート・脆弱性診断への取り組みDeNA_Techcon2017_DeNAでのチート・脆弱性診断への取り組み
DeNA_Techcon2017_DeNAでのチート・脆弱性診断への取り組みToshiharu Sugiyama
 
マルチテナントのアプリケーション実装〜実践編〜
マルチテナントのアプリケーション実装〜実践編〜マルチテナントのアプリケーション実装〜実践編〜
マルチテナントのアプリケーション実装〜実践編〜Yoshiki Nakagawa
 
DockerコンテナでGitを使う
DockerコンテナでGitを使うDockerコンテナでGitを使う
DockerコンテナでGitを使うKazuhiro Suga
 
SQLインジェクション再考
SQLインジェクション再考SQLインジェクション再考
SQLインジェクション再考Hiroshi Tokumaru
 
「龍が如くスタジオ」のQAエンジニアリング技術を結集した全自動バグ取りシステム
「龍が如くスタジオ」のQAエンジニアリング技術を結集した全自動バグ取りシステム「龍が如くスタジオ」のQAエンジニアリング技術を結集した全自動バグ取りシステム
「龍が如くスタジオ」のQAエンジニアリング技術を結集した全自動バグ取りシステムSEGADevTech
 
メトリクスによる「見える化」のススメ: エッセンシャル・リーン
メトリクスによる「見える化」のススメ: エッセンシャル・リーンメトリクスによる「見える化」のススメ: エッセンシャル・リーン
メトリクスによる「見える化」のススメ: エッセンシャル・リーンHiroyuki Ito
 
イベント・ソーシングを知る
イベント・ソーシングを知るイベント・ソーシングを知る
イベント・ソーシングを知るShuhei Fujita
 
目grep入門 +解説
目grep入門 +解説目grep入門 +解説
目grep入門 +解説murachue
 
RLSを用いたマルチテナント実装 for Django
RLSを用いたマルチテナント実装 for DjangoRLSを用いたマルチテナント実装 for Django
RLSを用いたマルチテナント実装 for DjangoTakayuki Shimizukawa
 
ネットワーク ゲームにおけるTCPとUDPの使い分け
ネットワーク ゲームにおけるTCPとUDPの使い分けネットワーク ゲームにおけるTCPとUDPの使い分け
ネットワーク ゲームにおけるTCPとUDPの使い分けモノビット エンジン
 
ドメイン駆動設計のための Spring の上手な使い方
ドメイン駆動設計のための Spring の上手な使い方ドメイン駆動設計のための Spring の上手な使い方
ドメイン駆動設計のための Spring の上手な使い方増田 亨
 
ドメイン駆動設計の正しい歩き方
ドメイン駆動設計の正しい歩き方ドメイン駆動設計の正しい歩き方
ドメイン駆動設計の正しい歩き方増田 亨
 
TDD のこころ
TDD のこころTDD のこころ
TDD のこころTakuto Wada
 
ユーザーストーリー駆動開発で行こう。
ユーザーストーリー駆動開発で行こう。ユーザーストーリー駆動開発で行こう。
ユーザーストーリー駆動開発で行こう。toshihiro ichitani
 
スマホゲームのチート手法とその対策 [DeNA TechCon 2019]
スマホゲームのチート手法とその対策 [DeNA TechCon 2019]スマホゲームのチート手法とその対策 [DeNA TechCon 2019]
スマホゲームのチート手法とその対策 [DeNA TechCon 2019]DeNA
 
【Unite Tokyo 2019】運用中超大規模タイトルにおけるUnityアップデート課題の解決手法と事例
【Unite Tokyo 2019】運用中超大規模タイトルにおけるUnityアップデート課題の解決手法と事例【Unite Tokyo 2019】運用中超大規模タイトルにおけるUnityアップデート課題の解決手法と事例
【Unite Tokyo 2019】運用中超大規模タイトルにおけるUnityアップデート課題の解決手法と事例UnityTechnologiesJapan002
 
オブジェクト指向エクササイズのススメ
オブジェクト指向エクササイズのススメオブジェクト指向エクササイズのススメ
オブジェクト指向エクササイズのススメYoji Kanno
 
DDD x CQRS 更新系と参照系で異なるORMを併用して上手くいった話
DDD x CQRS   更新系と参照系で異なるORMを併用して上手くいった話DDD x CQRS   更新系と参照系で異なるORMを併用して上手くいった話
DDD x CQRS 更新系と参照系で異なるORMを併用して上手くいった話Koichiro Matsuoka
 
エンジニアの個人ブランディングと技術組織
エンジニアの個人ブランディングと技術組織エンジニアの個人ブランディングと技術組織
エンジニアの個人ブランディングと技術組織Takafumi ONAKA
 

What's hot (20)

DeNA_Techcon2017_DeNAでのチート・脆弱性診断への取り組み
DeNA_Techcon2017_DeNAでのチート・脆弱性診断への取り組みDeNA_Techcon2017_DeNAでのチート・脆弱性診断への取り組み
DeNA_Techcon2017_DeNAでのチート・脆弱性診断への取り組み
 
マルチテナントのアプリケーション実装〜実践編〜
マルチテナントのアプリケーション実装〜実践編〜マルチテナントのアプリケーション実装〜実践編〜
マルチテナントのアプリケーション実装〜実践編〜
 
DockerコンテナでGitを使う
DockerコンテナでGitを使うDockerコンテナでGitを使う
DockerコンテナでGitを使う
 
SQLインジェクション再考
SQLインジェクション再考SQLインジェクション再考
SQLインジェクション再考
 
「龍が如くスタジオ」のQAエンジニアリング技術を結集した全自動バグ取りシステム
「龍が如くスタジオ」のQAエンジニアリング技術を結集した全自動バグ取りシステム「龍が如くスタジオ」のQAエンジニアリング技術を結集した全自動バグ取りシステム
「龍が如くスタジオ」のQAエンジニアリング技術を結集した全自動バグ取りシステム
 
メトリクスによる「見える化」のススメ: エッセンシャル・リーン
メトリクスによる「見える化」のススメ: エッセンシャル・リーンメトリクスによる「見える化」のススメ: エッセンシャル・リーン
メトリクスによる「見える化」のススメ: エッセンシャル・リーン
 
イベント・ソーシングを知る
イベント・ソーシングを知るイベント・ソーシングを知る
イベント・ソーシングを知る
 
目grep入門 +解説
目grep入門 +解説目grep入門 +解説
目grep入門 +解説
 
RLSを用いたマルチテナント実装 for Django
RLSを用いたマルチテナント実装 for DjangoRLSを用いたマルチテナント実装 for Django
RLSを用いたマルチテナント実装 for Django
 
ネットワーク ゲームにおけるTCPとUDPの使い分け
ネットワーク ゲームにおけるTCPとUDPの使い分けネットワーク ゲームにおけるTCPとUDPの使い分け
ネットワーク ゲームにおけるTCPとUDPの使い分け
 
ドメイン駆動設計のための Spring の上手な使い方
ドメイン駆動設計のための Spring の上手な使い方ドメイン駆動設計のための Spring の上手な使い方
ドメイン駆動設計のための Spring の上手な使い方
 
ドメイン駆動設計の正しい歩き方
ドメイン駆動設計の正しい歩き方ドメイン駆動設計の正しい歩き方
ドメイン駆動設計の正しい歩き方
 
TDD のこころ
TDD のこころTDD のこころ
TDD のこころ
 
ユーザーストーリー駆動開発で行こう。
ユーザーストーリー駆動開発で行こう。ユーザーストーリー駆動開発で行こう。
ユーザーストーリー駆動開発で行こう。
 
Docker Compose 徹底解説
Docker Compose 徹底解説Docker Compose 徹底解説
Docker Compose 徹底解説
 
スマホゲームのチート手法とその対策 [DeNA TechCon 2019]
スマホゲームのチート手法とその対策 [DeNA TechCon 2019]スマホゲームのチート手法とその対策 [DeNA TechCon 2019]
スマホゲームのチート手法とその対策 [DeNA TechCon 2019]
 
【Unite Tokyo 2019】運用中超大規模タイトルにおけるUnityアップデート課題の解決手法と事例
【Unite Tokyo 2019】運用中超大規模タイトルにおけるUnityアップデート課題の解決手法と事例【Unite Tokyo 2019】運用中超大規模タイトルにおけるUnityアップデート課題の解決手法と事例
【Unite Tokyo 2019】運用中超大規模タイトルにおけるUnityアップデート課題の解決手法と事例
 
オブジェクト指向エクササイズのススメ
オブジェクト指向エクササイズのススメオブジェクト指向エクササイズのススメ
オブジェクト指向エクササイズのススメ
 
DDD x CQRS 更新系と参照系で異なるORMを併用して上手くいった話
DDD x CQRS   更新系と参照系で異なるORMを併用して上手くいった話DDD x CQRS   更新系と参照系で異なるORMを併用して上手くいった話
DDD x CQRS 更新系と参照系で異なるORMを併用して上手くいった話
 
エンジニアの個人ブランディングと技術組織
エンジニアの個人ブランディングと技術組織エンジニアの個人ブランディングと技術組織
エンジニアの個人ブランディングと技術組織
 

Similar to WkWebViewのキャッシュについて調べた

Node.js で Web アプリ開発
Node.js で Web アプリ開発Node.js で Web アプリ開発
Node.js で Web アプリ開発Tatsumi Naganuma
 
誰にでもできるパフォーマンスチューニング
誰にでもできるパフォーマンスチューニング誰にでもできるパフォーマンスチューニング
誰にでもできるパフォーマンスチューニングKiyokazu Kaba
 
Voicepic@FukuiMASeminar
Voicepic@FukuiMASeminarVoicepic@FukuiMASeminar
Voicepic@FukuiMASeminarManabu Shimobe
 
見せたいデータに応じた取得方法を選ぼう!画面更新、ポーリング、WebSocketの比較
見せたいデータに応じた取得方法を選ぼう!画面更新、ポーリング、WebSocketの比較見せたいデータに応じた取得方法を選ぼう!画面更新、ポーリング、WebSocketの比較
見せたいデータに応じた取得方法を選ぼう!画面更新、ポーリング、WebSocketの比較Core Concept Technologies
 
Angular の紹介
Angular の紹介Angular の紹介
Angular の紹介Neo Xrea
 
WebIntentsにより拓かれる次のWeb
WebIntentsにより拓かれる次のWebWebIntentsにより拓かれる次のWeb
WebIntentsにより拓かれる次のWebKensaku Komatsu
 
なんとなくjQueryでAjaxをつかってみる
なんとなくjQueryでAjaxをつかってみるなんとなくjQueryでAjaxをつかってみる
なんとなくjQueryでAjaxをつかってみるHidetaka Okamoto
 
たのしいNode.js
たのしいNode.jsたのしいNode.js
たのしいNode.jsishiki-takai
 
サーバサイドいらずのWebアプリ
サーバサイドいらずのWebアプリサーバサイドいらずのWebアプリ
サーバサイドいらずのWebアプリKazuya Hiruma
 
Microsoft DevOps Hackathon (Sep 2015) Team 4 Presentation
Microsoft DevOps Hackathon (Sep 2015) Team 4 PresentationMicrosoft DevOps Hackathon (Sep 2015) Team 4 Presentation
Microsoft DevOps Hackathon (Sep 2015) Team 4 PresentationYuichiro Saito
 
Web frontend performance tuning
Web frontend      performance tuningWeb frontend      performance tuning
Web frontend performance tuningssuser3c214d
 
PhoneGapでWebアプリをスマホアプリ化
PhoneGapでWebアプリをスマホアプリ化PhoneGapでWebアプリをスマホアプリ化
PhoneGapでWebアプリをスマホアプリ化Takashi Okamoto
 
SharePoint 2013 Preview レビュー
SharePoint 2013 Preview レビューSharePoint 2013 Preview レビュー
SharePoint 2013 Preview レビューHirofumi Ota
 
Intalio japan special cloud workshop
Intalio japan special cloud workshopIntalio japan special cloud workshop
Intalio japan special cloud workshopDaisuke Sugai
 
Effective web performance tuning for smartphone
Effective web performance tuning for smartphoneEffective web performance tuning for smartphone
Effective web performance tuning for smartphonedena_study
 
Hands on PhotoBlog App with WordPress REST API and App Inventor
Hands on PhotoBlog App with WordPress REST API and App InventorHands on PhotoBlog App with WordPress REST API and App Inventor
Hands on PhotoBlog App with WordPress REST API and App InventorHong Chen
 
Web制作者がandriodのcddを読んでみた version1.1
Web制作者がandriodのcddを読んでみた version1.1Web制作者がandriodのcddを読んでみた version1.1
Web制作者がandriodのcddを読んでみた version1.1Masakazu Muraoka
 
UnityでつくるはじめてのPONG
UnityでつくるはじめてのPONGUnityでつくるはじめてのPONG
UnityでつくるはじめてのPONGKohei Kadowaki
 

Similar to WkWebViewのキャッシュについて調べた (20)

Node.js で Web アプリ開発
Node.js で Web アプリ開発Node.js で Web アプリ開発
Node.js で Web アプリ開発
 
誰にでもできるパフォーマンスチューニング
誰にでもできるパフォーマンスチューニング誰にでもできるパフォーマンスチューニング
誰にでもできるパフォーマンスチューニング
 
20160601 devtools
20160601 devtools20160601 devtools
20160601 devtools
 
Voicepic@FukuiMASeminar
Voicepic@FukuiMASeminarVoicepic@FukuiMASeminar
Voicepic@FukuiMASeminar
 
見せたいデータに応じた取得方法を選ぼう!画面更新、ポーリング、WebSocketの比較
見せたいデータに応じた取得方法を選ぼう!画面更新、ポーリング、WebSocketの比較見せたいデータに応じた取得方法を選ぼう!画面更新、ポーリング、WebSocketの比較
見せたいデータに応じた取得方法を選ぼう!画面更新、ポーリング、WebSocketの比較
 
Angular の紹介
Angular の紹介Angular の紹介
Angular の紹介
 
WebIntentsにより拓かれる次のWeb
WebIntentsにより拓かれる次のWebWebIntentsにより拓かれる次のWeb
WebIntentsにより拓かれる次のWeb
 
Google Product
Google ProductGoogle Product
Google Product
 
なんとなくjQueryでAjaxをつかってみる
なんとなくjQueryでAjaxをつかってみるなんとなくjQueryでAjaxをつかってみる
なんとなくjQueryでAjaxをつかってみる
 
たのしいNode.js
たのしいNode.jsたのしいNode.js
たのしいNode.js
 
サーバサイドいらずのWebアプリ
サーバサイドいらずのWebアプリサーバサイドいらずのWebアプリ
サーバサイドいらずのWebアプリ
 
Microsoft DevOps Hackathon (Sep 2015) Team 4 Presentation
Microsoft DevOps Hackathon (Sep 2015) Team 4 PresentationMicrosoft DevOps Hackathon (Sep 2015) Team 4 Presentation
Microsoft DevOps Hackathon (Sep 2015) Team 4 Presentation
 
Web frontend performance tuning
Web frontend      performance tuningWeb frontend      performance tuning
Web frontend performance tuning
 
PhoneGapでWebアプリをスマホアプリ化
PhoneGapでWebアプリをスマホアプリ化PhoneGapでWebアプリをスマホアプリ化
PhoneGapでWebアプリをスマホアプリ化
 
SharePoint 2013 Preview レビュー
SharePoint 2013 Preview レビューSharePoint 2013 Preview レビュー
SharePoint 2013 Preview レビュー
 
Intalio japan special cloud workshop
Intalio japan special cloud workshopIntalio japan special cloud workshop
Intalio japan special cloud workshop
 
Effective web performance tuning for smartphone
Effective web performance tuning for smartphoneEffective web performance tuning for smartphone
Effective web performance tuning for smartphone
 
Hands on PhotoBlog App with WordPress REST API and App Inventor
Hands on PhotoBlog App with WordPress REST API and App InventorHands on PhotoBlog App with WordPress REST API and App Inventor
Hands on PhotoBlog App with WordPress REST API and App Inventor
 
Web制作者がandriodのcddを読んでみた version1.1
Web制作者がandriodのcddを読んでみた version1.1Web制作者がandriodのcddを読んでみた version1.1
Web制作者がandriodのcddを読んでみた version1.1
 
UnityでつくるはじめてのPONG
UnityでつくるはじめてのPONGUnityでつくるはじめてのPONG
UnityでつくるはじめてのPONG
 

More from firewood

Best Bugs 2017 in the SmartNews iOS app
Best Bugs 2017 in the SmartNews iOS appBest Bugs 2017 in the SmartNews iOS app
Best Bugs 2017 in the SmartNews iOS appfirewood
 
Xcodeでmrubyをステップ実行してみた
Xcodeでmrubyをステップ実行してみたXcodeでmrubyをステップ実行してみた
Xcodeでmrubyをステップ実行してみたfirewood
 
Xcodeで値を表示する
Xcodeで値を表示するXcodeで値を表示する
Xcodeで値を表示するfirewood
 
SmartNewsアプリの品質
SmartNewsアプリの品質SmartNewsアプリの品質
SmartNewsアプリの品質firewood
 
delayed_jobの自動再起動
delayed_jobの自動再起動delayed_jobの自動再起動
delayed_jobの自動再起動firewood
 
C++でHello worldを書いてみた
C++でHello worldを書いてみたC++でHello worldを書いてみた
C++でHello worldを書いてみたfirewood
 
フィルタドライバ入門
フィルタドライバ入門フィルタドライバ入門
フィルタドライバ入門firewood
 
三日で書くGroonga関数
三日で書くGroonga関数三日で書くGroonga関数
三日で書くGroonga関数firewood
 

More from firewood (10)

Best Bugs 2017 in the SmartNews iOS app
Best Bugs 2017 in the SmartNews iOS appBest Bugs 2017 in the SmartNews iOS app
Best Bugs 2017 in the SmartNews iOS app
 
Xcodeでmrubyをステップ実行してみた
Xcodeでmrubyをステップ実行してみたXcodeでmrubyをステップ実行してみた
Xcodeでmrubyをステップ実行してみた
 
Xcodeで値を表示する
Xcodeで値を表示するXcodeで値を表示する
Xcodeで値を表示する
 
SmartNewsアプリの品質
SmartNewsアプリの品質SmartNewsアプリの品質
SmartNewsアプリの品質
 
delayed_jobの自動再起動
delayed_jobの自動再起動delayed_jobの自動再起動
delayed_jobの自動再起動
 
C++でHello worldを書いてみた
C++でHello worldを書いてみたC++でHello worldを書いてみた
C++でHello worldを書いてみた
 
フィルタドライバ入門
フィルタドライバ入門フィルタドライバ入門
フィルタドライバ入門
 
三日で書くGroonga関数
三日で書くGroonga関数三日で書くGroonga関数
三日で書くGroonga関数
 
L-R
L-RL-R
L-R
 
FPGA
FPGAFPGA
FPGA
 

WkWebViewのキャッシュについて調べた