検証端末
- iOS 7
- iPhone 4S
Cache.dbの中をみる
WebviewのディスクキャッシュはどうやらCache.dbというファイルに記録されている模様である.そこでiFuxBoxで取り出してみて解析してみた.
iFunBoxで該当アプリ以下のLibrary/CachesをMac上に取り出す.
Caches/バンドルID/Cache.dbにsqliteのDBファイルがあるので,sqliteで開く.
% sqlite3 Cache.db
とりあえず,テーブル一覧を見てみる.
sqlite> .tables
cfurl_cache_blob_data cfurl_cache_response
cfurl_cache_receiver_data cfurl_cache_schema_version
次はスキーマを見てみる.
sqlite> .schema cfurl_cache_response
CREATE TABLE cfurl_cache_response(entry_ID INTEGER PRIMARY KEY
AUTOINCREMENT UNIQUE, version
INTEGER, hash_value INTEGER, storage_policy INTEGER, request_key TEXT
UNIQUE, time_stamp NOT NULL
DEFAULT CURRENT_TIMESTAMP, partition TEXT);
CREATE INDEX request_key_index ON cfurl_cache_response(request_key);
CREATE INDEX time_stamp_index ON cfurl_cache_response(time_stamp);
ほうほう.
他のテーブルのスキーマを調べたところ,こんな感じになっていた.
一部,勘だったり,わからないところもあった.
cfurl_cache_responseテーブル
- entry_ID: キャッシュのID
- version: わからない(キャッシュのバージョン?)
- hash_value: たぶん,レスポンスのハッシュ値
- storage_policy: わからない
- request_key: リクエストのURL
- time_stamp: タイムスタンプ
- partition: わからない
cfurl_cache_blob_dataテーブル
- entry_ID: キャッシュのID
- response_object: レスポンスヘッダ?(BLOB),plist形式
- request_object: リクエストヘッダ?(BLOB), plist形式
- user_info: わからない
cfurl_cache_receiver_dataテーブル
- entry_ID: キャッシュのID
- isDataOnFS: 1:ファイルとして保存,0: receiver_dataに保存
- receiver_data:
isDataOnFS が0の場合は受け取ったデータのBLOB,
1の場合はファイルとして保存されている場合のファイル名(Library/Caches/バンドルID/fsCachedData以下にある)
キャッシュされたファイルを取り出す
上記のようなスキーマになっているので,ファイルを取り出すのは簡単だ.
まずはcfurl_cache_response
テーブルから,それっぽいURLを検索して,entry_IDを絞る.
今回は1x50.png
という画像を検索してみた.
sqlite> select * from cfurl_cache_response where request_key like '%/1x50.png';
108|0|3915446248|0|http://xxxxx/img/1x50.png|2014-07-06 14:24:26|
entry_ID
が108
なので,cfurl_cache_receiver_data
を検索してみる.
sqlite> select entry_ID, isDataOnFS, hex(receiver_data) from cfurl_cache_receiver_data where entry_ID=108;
108|0|89504E470D0A1A0A0000000D4948445200000001000000320802000000129926DD0000001649444154789C626A68686062606018EA18100000FFFF51AF01E5F024F2350000000049454E44AE426082
このファイルは小さいので,ファイルとして書き出されずに直接DBに突っ込まれている.BLOBのまま出力しても化けるだけなので,hexで16進で表示させている.
ちなみに,isDataOnFS
が1の時は,Library/Caches/バンドルID/fsCachedData
以下に,ファイルとして保存される.そして,ファイル名はreceiver_data
に入っている.
sqlite> select * from cfurl_cache_receiver_data where isDataOnFS=1 limit 1;
140|1|327B2D66-B3E5-428D-B3EB-30FFA815875B
この場合は327B2D66-B3E5-428D-B3EB-30FFA815875B
という名前で保存されている.
% file fsCachedData/327B2D66-B3E5-428D-B3EB-30FFA815875B
fsCachedData/327B2D66-B3E5-428D-B3EB-30FFA815875B: PNG image data, 1634 x 2224, 8-bit/color RGBA, non-interlaced
ちなみに,保存されていたのは,この画像.でかい.