4

私は私の中で2つのことを解決しようとしていUIWebViewます:

  1. 適切な条件下で、リモート アセットの代わりにローカル アセットをロードする
  2. ローカルアセットがない場合、または古い場合は、通常どおりリモートアセットをロードします
  3. サーバーから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 にいくつかのバグがあるようです。

  1. UIWebViewCache-ControlHTML コンテンツのサーバー ヘッダーを無視します。
  2. UIWebViewNSCachedURLResponse、メインの HTML リクエストに対して を要求しますが、無視されて破棄されます。
  3. UIWebViewNSURLCache、リクエストでロードする場合はアセットを要求しますが、HTML またはデータをロードする場合は、キャッシュを完全にバイパスし、リモート サーバーから直接リクエストします。

まず最初に、これらの問題に対する解決策を見つけた人はいますか? 次に、私が愚かであり、これらが実際には SDK のバグではない理由はありますか?

4

2 に答える 2

1

私はこれを放棄しました。落とし穴が多すぎた。代わりに、ajaxを介して新しいページをロードします。そして、代わりに[webview goBack]私のためにクールなことをするためのカスタムJavaScriptがあります[webview stringByEvaluatingJavascriptFromString:@"goBack()"]

于 2010-01-20T18:29:39.610 に答える
1

最初の #3 に取り組むには:

少し風変わりに思えるかもしれませんが、ダウンロードした HTML を NSUserDefaults オブジェクトにフラットな文字列として保持し、後で必要になったときに (条件付きで) 復元するのはどうですか?

于 2010-01-20T17:34:54.543 に答える