2011-07-14 13 views
15

Estoy trabajando en una página de mezcla de texto-imagen en iOS. Sé que es posible para mí usar UIWebView para lograr el objetivo. Pero el problema es que el usuario puede necesitar leer la página sin conexión. Para la parte de texto, puedo guardar el html en el disco y cargarlo en el modo fuera de línea. Pero ¿qué tal las imágenes? ¿Es posible almacenar en caché las imágenes en el disco y UIWebView aún puede mostrarlas?cómo almacenar en caché toda una página web con imágenes en iOS

¡Gracias!

Respuesta

15

El ASIHTTPRequest project tiene una clase llamada ASIWebPageRequest que está diseñada para hacer exactamente lo que usted desea. Si está de acuerdo con añadir una dependencia adicional a su proyecto, entonces creo que es una buena solución para usted: ASIWebPageRequest.

En la página me ha gustado más arriba hay algunos buenos ejemplos de cómo usarlo, pero voy a incluir una de ellas aquí para completar:

- (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

Gracias mucho para esta muestra, a tratar más adelante. ¿Podría decirme cómo ASIReplaceExternalResourcesWithData puede incrustar los datos en la página? La página sigue siendo un archivo html en el caché, ¿verdad? ¿La solicitud modifica el html original? –

+0

Sí, tienes razón. ASI modifica la página y reemplaza esos activos con [URI de datos] (http://en.wikipedia.org/wiki/Data_URI_scheme). Alternativamente, puede usar un modo de reemplazo de URL diferente llamado 'ASIReplaceExternalResourcesWithLocalURLs' que descargará los recursos como archivos pero aún modificará el HTML para apuntar a estos archivos locales. – xoebus

+0

Gracias xoebus. También descubrí que para habilitar la exploración sin conexión, necesito agregar esta línea de código: 'request.cachePolicy = ASIAskServerIfModifiedCachePolicy | ASIFallbackToCacheIfLoadFailsCachePolicy;' –

Cuestiones relacionadas