私は私の中で2つのことを解決しようとしていUIWebView
ます:
- 適切な条件下で、リモート アセットの代わりにローカル アセットをロードする
- ローカルアセットがない場合、または古い場合は、通常どおりリモートアセットをロードします
- サーバーからhtmlをリロードする必要なく、webviewが「戻る」ことを許可します
#1 と #2 を処理するために、カスタム サブクラスを実装しましたNSURLCache
。WebView がアセットをリクエストしたときに呼び出され、代わりにローカルのものを送信して、アセットのサーバー呼び出しを中止できます。ローカル バージョンが古いかどうか、またはどれを使用するかを判断できないかどうかを知る、ちょっとしたタイムスタンプ システムもあります。
しかし、#3は私をループに投げ込んでいます。キャッシュ制御ヘッダーに関係なく、UIWebView
戻るときに常に HTML をリロードするようです。
そこで、カスタムNSURLCache
クラスで HTML を強制的にキャッシュしようとしました。NSCachedURLResponse
動作しているようで、必要なHTMLのインスタンスを返しますがUIWebView
、サーバーからそれを認識してロードすることに失敗します。いくつかの検索の後、URL キャッシュに「矛盾」がいくつかあることがわかりましたUIWebView
。これはその 1 つだと思います。アセットには最適ですが、表示しようとしているページを構成する HTML にはあまり適していません。
それで、これはうまくいかないかもしれないので、手動で行うことにしました。URL のスタックと、手動でフェッチしてロードするデータを作成しましたloadData:MIMEType:textEncodingName:baseURL:
。見よ、それはうまくいったようだ!これで戻ることができ、Web ビュー デリゲートが負荷をインターセプトし、代わりに手動で取得したデータを読み込むように指示し、サーバーがヒットすることはありませんでした。
しかし、NSURLCache がアセットに使用されなくなっていることに気付きました。loadRequest:
セットを使用してデータまたは html 文字列をbaseUrl
適切にロードするのではなく、コンテンツをロードする場合にのみ、キャッシュされたアセットを要求するようです。
したがって、私の努力にもかかわらず、Webビューに条件付きでローカルアセットをロードさせ、サーバーにアクセスせずに戻ることはできません。SDK にいくつかのバグがあるようです。
UIWebView
Cache-Control
HTML コンテンツのサーバー ヘッダーを無視します。UIWebView
はNSCachedURLResponse
、メインの HTML リクエストに対して を要求しますが、無視されて破棄されます。UIWebView
はNSURLCache
、リクエストでロードする場合はアセットを要求しますが、HTML またはデータをロードする場合は、キャッシュを完全にバイパスし、リモート サーバーから直接リクエストします。
まず最初に、これらの問題に対する解決策を見つけた人はいますか? 次に、私が愚かであり、これらが実際には SDK のバグではない理由はありますか?