2

私の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キャッシングディレクティブを無視しますか?)。

アイデア???

4

0 に答える 0