WebView(UIWebView)でhttpキャッシュコントロールを実現する方法
WebView(UIWebView)でhttpキャッシュコントロールを実現する方法
httpという通信プロトコルは通信を円滑に行うための仕組みとして、「キャッシュ」という仕組みをもっている。
ブラウザなどのhttpクライアントが一度受け取ったテキストや画像などのコンテンツを一定期間保持したままにして、その保持期間のあいだはサーバーから取得しないというのがキャッシュ機構である。
httpキャッシュは次の3通りの方法で制御することができる。
それぞれ一長一短があるが、キャッシュ制御定義をきめ細かく設定できるし動作も安定しているため、Apatchなどのサーバー側でhttpキャッシュ制御を行うことをお勧めする。
・ブラウザ、クライアント設定
httpクライアントで設定する場合は、すべてのコンテンツがキャッシュ対象から外れるため、ウェブアプリなどjavaScriptフレームワークを多用するコンテンツの場合には、アクセスのたびに毎回フレームワークをダウンロードし直すことになり、アクセス開始してからコンテンツがロード完了するまでの時間がかかり過ぎる場合がある。
<android>
WebView webView = (WebView)findViewById(R.id.webView);WebSettings webSet = webView.getSettings();webSet.setCacheMode(LOAD_NO_CACHE);
<iOS>
[[NSURLCache sharedURLCache] setMemoryCapacity:0];- (BOOL)webView:(UIWebView *)webView shouldStartLoadWithRequest:(NSURLRequest *)request navigationType:(UIWebViewNavigationType)navigationType { [[NSURLCache sharedURLCache] removeAllCachedResponses]; if (request.cachePolicy != NSURLRequestReloadIgnoringLocalCacheData) { NSMutableURLRequest *urlRequest = (NSMutableURLRequest *)request; urlRequest.cachePolicy = NSURLRequestReloadIgnoringLocalCacheData; } return YES;}
・Apatchサーバ設定
一番おすすめなのはサーバ側でキャッシュ制御を行うことだ。
httpプロトコルでは、コンテンツをサーバーからクライアントに送信する際にhttpヘッダーにキャッシュ制御を定義することができる。
ファイルタイプごとに定義できるので、javaScriptフレームワークやxxx.jsなどのプログラム部分のみをキャッシュし、更新頻度が高いコンテンツ部分はキャッシュしないように定義することができる。
.htaccessで頻繁に更新されることが想定されるファイルタイプをキャッシュしないように定義する。
<html、画像、CSSファイルをキャッシュ抑制する例>
Header set Pragma no-cache Header set Cache-Control no-cache
・htmlコンテンツ設定
htmlのバージョンが改版されるごとに、httpキャッシュに対する定義方法が変わっている。
html5.1からは、htmlでのhttpキャッシュ制御を行う方法は定義されていない。
そもそもコンテンツ本文で通信プロトコルに関する定義を行うことは避けた方が良い。
<html4まで有効だったhttpキャッシュ制御方法>
html5からmetaタグのhttp-equiv属性の”Cache-Control”が使えなくなった。
<html5で有効だったhttpキャッシュ制御方法>
CACHE MANIFESTCACHE:NETWORK:\*
html5.1からはhtmlタグのmanifest属性は使えなくなった。
「manifestファイル」でキャッシュコントロールするには正規表現が使えないなど、機能がとても不足していた。