2011-07-14 3 views
15

Je travaille sur une page de mélange d'image-texte sur iOS. Je sais qu'il est possible pour moi d'utiliser UIWebView pour atteindre l'objectif. Mais le problème est, l'utilisateur peut avoir besoin de lire la page hors ligne. Pour la partie de texte, je peux enregistrer le code HTML sur le disque et le charger en mode hors ligne. Mais qu'en est-il des images? Est-il possible de mettre les images en cache sur le disque et UIWebView peut-il encore les afficher?comment mettre en cache une page Web entière avec des images dans iOS

Merci!

Répondre

15

Le ASIHTTPRequest project a une classe appelée ASIWebPageRequest qui est conçue pour faire exactement ce que vous voulez. Si vous êtes d'accord avec l'ajout d'une dépendance supplémentaire à votre projet, je pense que c'est une bonne solution pour vous: ASIWebPageRequest.

Sur la page ci-dessus que j'ai aimé il y a quelques bons exemples de la façon de l'utiliser, mais je vais inclure un d'entre eux ici pour être complet:

- (IBAction)loadURL:(NSURL *)url 
{ 
    // Assume request is a property of our controller 
    // First, we'll cancel any in-progress page load 
    [[self request] setDelegate:nil]; 
    [[self request] cancel]; 

    [self setRequest:[ASIWebPageRequest requestWithURL:url]]; 
    [[self request] setDelegate:self]; 
    [[self request] setDidFailSelector:@selector(webPageFetchFailed:)]; 
    [[self request] setDidFinishSelector:@selector(webPageFetchSucceeded:)]; 

    // Tell the request to embed external resources directly in the page 
    [[self request] setUrlReplacementMode:ASIReplaceExternalResourcesWithData]; 

    // It is strongly recommended you use a download cache with ASIWebPageRequest 
    // When using a cache, external resources are automatically stored in the cache 
    // and can be pulled from the cache on subsequent page loads 
    [[self request] setDownloadCache:[ASIDownloadCache sharedCache]]; 

    // Ask the download cache for a place to store the cached data 
    // This is the most efficient way for an ASIWebPageRequest to store a web page 
    [[self request] setDownloadDestinationPath: 
     [[ASIDownloadCache sharedCache] pathToStoreCachedResponseDataForRequest:[self request]]]; 

    [[self request] startAsynchronous]; 
} 

- (void)webPageFetchFailed:(ASIHTTPRequest *)theRequest 
{ 
    // Obviously you should handle the error properly... 
    NSLog(@"%@",[theRequest error]); 
} 

- (void)webPageFetchSucceeded:(ASIHTTPRequest *)theRequest 
{ 
    NSString *response = [NSString stringWithContentsOfFile: 
     [theRequest downloadDestinationPath] encoding:[theRequest responseEncoding] error:nil]; 
    // Note we're setting the baseURL to the url of the page we downloaded. This is important! 
    [webView loadHTMLString:response baseURL:[request url]]; 
} 
+0

Merci beaucoup pour cet échantillon, va essayer plus tard. Pourriez-vous me dire comment ASIReplaceExternalResourcesWithData peut intégrer les données à la page? La page reste un fichier html dans le cache, non? La requête modifie-t-elle le code HTML d'origine? –

+0

Oui, vous avez raison. ASI modifie la page et remplace ces actifs par [Data URIs] (http://en.wikipedia.org/wiki/Data_URI_scheme). Alternativement, vous pouvez utiliser un autre mode de remplacement d'URL appelé 'ASIReplaceExternalResourcesWithLocalURLs' qui téléchargera les ressources sous forme de fichiers tout en modifiant le code HTML pour pointer sur ces fichiers locaux. – xoebus

+0

Merci xoebus. J'ai également découvert que pour activer la navigation hors ligne, j'ai besoin d'ajouter cette ligne de code: 'request.cachePolicy = ASIAskServerIfModifiedCachePolicy | ASIFallbackToCacheIfLoadFailsCachePolicy;' –

Questions connexes