web-dev-qa-db-ja.com

後でロードするためにUIWebViewにコンテンツをキャッシュする方法は?

Iphoneサファリはコンテンツをキャッシュするので、後でページをロードするときの速度がデスクトップブラウザーのようにはるかに速くなります。たとえば、モバイルGmailのWebページを例にとると、最初の読み込みはかなり遅くなります(5〜10秒)。しかし、タブを閉じてページを再び開くと、非常に高速(1秒)です。

ただし、アプリのUIWebViewを介してコンテンツを読み込む場合、この動作は同じではありません。一部の設定が不足していますか?自分でコンテンツを保存する手間をかけずに、UIWebViewにコンテンツを自動的にキャッシュさせるにはどうすればよいですか?

23
erotsppa

キーは次のとおりです:NSURLRequestReturnCacheDataElseLoad

NSData *urlData;
NSString *baseURLString =  @"mysite.com";
NSString *urlString = [baseURLString stringByAppendingPathComponent:@"myfile"];

NSURLRequest *request = [NSURLRequest requestWithURL:[NSURL URLWithString:urlString] cachePolicy:NSURLRequestReturnCacheDataElseLoad timeoutInterval: 10.0]; 
NSURLConnection *connection=[[NSURLConnection alloc] initWithRequest:request delegate:nil]; 

if (connection)
{ 
    urlData = [NSURLConnection sendSynchronousRequest: request];

    NSString *htmlString = [[NSString alloc] initWithData:urlData encoding:NSUTF8StringEncoding];
    [webView loadHTMLString:htmlString baseURL:baseURLString];
    [htmlString release];
}

[connection release];
23
zaph
NSString *stringurl=[NSString stringWithFormat:@"http://www.google.com"];
NSURL *url=[NSURL URLWithString:stringurl];
NSMutableURLRequest *theRequest = [NSMutableURLRequest requestWithURL:url cachePolicy:NSURLRequestReturnCacheDataElseLoad timeoutInterval:15.0];
[uiwebview loadRequest:theRequest];

最初にURLをロードし、コンテンツの変更のみを探します。URLコンテンツに更新がない場合は、キャッシュ(ローカルストレージ)からロードします。

4
Rahul K Rajan

このディスカッションスレッド に基づくと、UIWebViewを使用してOSレベルのキャッシュを実行することはできないようです。経験に基づいて、iPhone OSデバイスのSafariがそのWebページをキャッシュしないことに気付きました(たとえば、Safariで[戻る]ボタンを押しても、古いページがキャッシュからリロードされません)。

2
fbrereto

ページをドキュメントフォルダーにキャッシュするアプリをいくつか実行してから、新しいWebページを読み込む前に、キャッシュされた&Webページのタイムスタンプを比較しました。したがって、基本的なフローは次のとおりです。

if (fileIsInCache)
    if (cacheFileDate > webFileDate)
        getCachedFile
    else
        getFileFromWeb
        saveFileToCache
else
    getFileFromWeb
    saveFileToCache

stuffFileIntoUIView

maybeReduceCache

ヘッダーを取得するにはまだウェブにアクセスする必要がありますが、通常はページ全体、画像、ファイル全体をダウンロードするよりもはるかに高速です。

0
Olie