11

iPhone用に最適化されたサイトをロードするシンプルなアプリがありUIWebViewます.

問題は、キャッシュが機能していないように見えることです:

[webView loadRequest: [NSURLRequest requestWithURL: [NSURL URLWithString: url]
                                       cachePolicy: NSURLRequestUseProtocolCachePolicy
                                   timeoutInterval: 60.0]];

このリモート ページで参照されているもの (css、画像、外部 JavaScript ファイル) はキャッシュされません (リクエストが If-Modified-Since ヘッダーやキャッシュ制御の方法で何かを送信することはありません)。

出来ますか?通常の Cocoa WebView には、リソース要求ごとに呼び出されるデリゲート メソッドとポスト ロード ( -didFinishLoadingFromDataSource:) があり、独自のキャッシュを展開するために使用できるようです。しかし、ここでは当てはまらないようです。

私のページ全体 (ページとその参照リソース) は約 89K 圧縮されています..これは、いくつかのスポットで 3G よりも遅く、EDGE よりもさらに悪いです。着信要求は、少なくとも圧縮 ( accept-encoding=gzip, deflate) を受け入れることを示しているので、それで問題ないと思います。

この yui studyを読みましたが、これは iPhone がアイテムごとに 25k をキャッシュすることを示しているようです。非圧縮で 25k を超える唯一のものは jquery です (圧縮されていますが非圧縮 - 30k です)。他のすべてはキャッシュ可能でなければなりません。フェッチされたページで参照されているものに対するリクエストは、サーバー側で 304 をトリガーしていません。

その yui の調査はほぼ 1 年前のもので、モバイル サファリのみで推測しています。

これはUIWebView、ネイティブの iPhone アプリで を使用しています。

4

6 に答える 6

7

私が見ているこの問題の1つの回避策は、

1) HTMLコードをダウンロード

2) 文字列に格納する

3)その中のすべての外部リンクを次のように見つけます

<img src="img.gif" width="..." height="..." />

4) それらをすべてダウンロードする

5) 埋め込まれた Base64 でエンコードされたバージョンに置き換えます

<img src="data:image/gif;base64,R0lGODlhUAAPA...JADs= " width="..." height="..." />

6) 最後に、必要に応じて画像を埋め込んだ完全な HTML を保存します。

于 2009-07-28T18:25:36.827 に答える
5

https://github.com/phonegap/phonegap-iphone/issues/148から:

NSURLCache* cache = [NSURLCache sharedURLCache];
[cache setMemoryCapacity:4 * 1024 * 1024];
[cache setDiskCapacity:512*1024];

[NSURLRequest requestWithURL:appURL
                 cachePolicy:NSURLRequestReturnCacheDataElseLoad
             timeoutInterval:10.0];
于 2011-07-10T21:33:02.857 に答える
4

ASIWebPageRequestAll Seeing Interactive で試すことができるようになりました。

ASIWebPageRequest は、ASIHTTPRequest ファミリーに新たに追加された実験的なものです。これを使用して、画像やスタイルシートなどの外部リソースを含む完全な Web ページを 1 回の要求でダウンロードできます。Web ページがダウンロードされると、リクエストはコンテンツを解析し、外部リソースを探してダウンロードし、Data URIS を使用して HTML ソースに直接挿入します。次に、応答を取得して、Mac の UIWebView / WebView に直接配置できます。

いずれにしても、あらゆる種類の HTTP 操作に Ben Copsey の優れたライブラリを使用するようにアドバイスすることしかできません。

更新: Ben は ASIHTTPRequest を廃止しました。私はもはやそれを使用することをお勧めしません。

于 2010-08-06T10:40:25.443 に答える
2

リクエストはいつでも手動で実行できますが、それは面倒ですが、心ゆくまでキャッシュすることができます。UIWebViewDelegateでリクエストを開始する をビルドしwebView:shouldStartLoadWithRequest:navigationType:、結果をキャッシュし、UIWebView を使用しloadHTMLString:baseURL:てビューを更新します。

それは醜いものであり、物事はあなたが望むほどスムーズには機能しませんが、必要なものには十分かもしれません.

于 2008-12-22T14:21:27.587 に答える
1

ihon は、通常のコンピューターに比べてキャッシュ容量が限られています。圧縮されていないキャッシュ項目を 25k に制限します。

良い情報はこちら: http://yuiblog.com/blog/2008/02/06/iphone-cacheability/

于 2008-12-05T23:28:09.163 に答える
0

この Cocoa with Love の記事: Substituting local data for remote UIWebView requestsで説明されているように、サブクラスNSURLCache化して、 で使用される共有キャッシュに置き換えることができるはずです。UIWebView

別のアプローチについては、UIWebView (および NSURLProtocol) の Drop-in offline caching をご覧ください

于 2012-10-17T11:42:39.203 に答える