web-dev-qa-db-fra.com

Comment mettre en cache le contenu dans UiWebView pour un chargement plus rapide plus tard?

Je remarque que l'iPhone Safari met en cache le contenu de manière à ce que votre page chargee pour plus tard soit beaucoup plus rapide comme un navigateur de bureau. Alors prenez la page Web Gmail mobile, par exemple, la première charge est assez lente (5-10 secondes). Mais si je ferme l'onglet et rouvrez la page à nouveau, c'est très rapide (1 seconde).

Cependant, ce comportement n'est pas le même si vous chargez le contenu via une UIWebView dans votre application. Est-ce que je manque des paramètres? Comment faire le cache UiWebView le contenu automatiquement sans passer par le souci de sauver moi-même?

23
erotsppa

La clé est la suivante: 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];

Il chargera une URL première fois puis recherchera uniquement les modifications du contenu .., s'il n'y a pas de mises à jour dans le contenu de l'URL, elle se charge du cache (stockage local).

4
Rahul K Rajan

Basé sur - ce fil de discussion Il apparaîtrait qu'il n'y a pas de mise en cache au niveau du système d'exploitation possible avec UIWebView. Basé sur l'expérience que j'ai remarqué que Safari sur mon périphérique OS iPhone ne cache pas ses pages Web (par exemple, frapper le bouton arrière dans Safari ne recharge pas l'ancienne page d'un cache).

2
fbrereto

J'ai fait quelques applications qui cachent les pages de cache dans le dossier Documents, puis comparez les horodatages des pages Cached & Web avant de charger la nouvelle page Web. Donc, le flux de base est:

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

stuffFileIntoUIView

maybeReduceCache

Vous devez toujours frapper le Web pour obtenir les en-têtes, mais c'est généralement beaucoup plus rapide que le téléchargement d'une page/image/fichier/fichier.

0
Olie