私のiPhoneアプリには、登録したカスタムNSProtocolハンドラーを介してhtmlをロードするUIWebViewが埋め込まれています。
私の問題は、返されたhtmlで参照されているリソースがキャッシュされ、再ロードされないことです。特に、私のスタイルシートはキャッシュされます:
<link rel="stylesheet" type="text/css" href="./styles.css" />
UIWebViewにhtmlをロードする最初のリクエストは次のようになります。
NSString * strUrl = [NSMutableString stringWithFormat:@ "myprotocol:/// entry?id =%d"、entryID]; NSURL * url = [NSURL URLWithString:strUrl]; [_pCurrentWebView loadRequest:[NSURLRequest requestWithURL:url cachePolicy:NSURLRequestReloadIgnoringLocalCacheData timeoutInterval:60]];
(キャッシュポリシーは無視するように設定されていることに注意してください。このキャッシュポリシーが、初期ロード時にページリソースの後続の要求に引き継がれることを確認しました)
プロトコルハンドラーはデータベースからhtmlをロードし、次のようなコードを使用してクライアントに返します。
//応答レコードを作成します NSURLResponse * response = [[NSURLResponse alloc] initWithURL:[request URL] MIMEType:mimeType expectedContentLength:-1 textEncodingName:textEncodingName]; //クライアントへの参照を取得して、データを渡すことができるようにします id client=[セルフクライアント]; //この応答データのキャッシュをオフにします [クライアントURLプロトコル:self didReceiveResponse:response cacheStoragePolicy:NSURLCacheStorageNotAllowed]; //jfifデータへの応答にデータを設定します [クライアントURLプロトコル:self didLoadData:data]; [データリリース];
(応答キャッシュポリシーは「許可されていない」ことに注意してください)。
styles.cssリソースをキャッシュしないようにする方法はありますか?このファイルを参照するhtmlの後続のロードで、このリソースのコンテンツを動的に変更できる必要があります。
共有URLキャッシュをクリアすることは機能すると思いましたが、機能しません。
[[NSURLCache sharedURLCache] removeAllCachedResponses];
動作するものの1つは、非常に非効率的です。タイムスタンプパラメータを追加して、スタイルシートのURLを動的にキャッシュバストすることです。
<link rel="stylesheet" type="text/css" href="./styles.css?ts=1234567890" />
これを機能させるには、データベースからhtmlをロードし、スタイルシートのURLを検索して、リクエストごとに変更されるキャッシュ無効化パラメーターに置き換える必要があります。私はむしろこれをしたくない。
組み込みのHTTPプロトコルを介してコンテンツをロードしても問題はないと思います。その場合、UIWebViewはNSURLHTTPResponseオブジェクトのhttpヘッダー内のCache-Controlフラグを調べ、それらを順守していると思います。私のNSURLResponseObjectにはhttpヘッダーがないので(http ...ではありません)、おそらくUIWebViewはリソースをキャッシュすることを決定します(NSURLRequestキャッシングディレクティブを無視しますか?)。
アイデア???