2009-10-08 17 views
19

Vorrei poter utilizzare il manifest della cache html5 per archiviare le immagini localmente su un iPhone che sta visitando la pagina tramite uno UIWebView all'interno di un'app.manifest di cache HTML5 in un UIWebView?

Ho impostato un campione che ritengo conforme alle specifiche e sembra funzionare in safari 4 e in mobile safari, ma non nel numero UIWebView della mia app.

L'html di esempio è impostato su http://bynomial.com/html5/clock3.html.

Questo è molto simile al campione fornito nello HTML5 draft standard.

Ecco il codice intero (non-modello) delle app di esempio che sto utilizzando per il test:

- (void)applicationDidFinishLaunching:(UIApplication *)application {  

    // I thought this might help - I don't see any difference, though. 
    NSURLCache* cache = [NSURLCache sharedURLCache]; 
    [cache setDiskCapacity:512*1024]; 

    CGRect frame = [[UIScreen mainScreen] applicationFrame]; 
    UIWebView* webView = [[UIWebView alloc] initWithFrame:frame]; 
    [window addSubview:webView]; 

    NSString* urlString = @"http://bynomial.com/html5/clock3.html"; 
    NSURL* url = [NSURL URLWithString:urlString]; 
    NSURLRequest* request = [NSURLRequest requestWithURL:url]; 
    [webView loadRequest:request]; 

    [window makeKeyAndVisible]; 
} 

ho rivisto alcune domande correlate sul StackOverflow, ma non sembrano fornire informazioni per risolvere questo. Ad esempio, sono abbastanza sicuro che i file che sto cercando di memorizzare nella cache non siano troppo grandi, dal momento che sono solo un paio di piccoli file di testo (modo < 25k).

Qualche idea su come farlo funzionare?

+0

Tyler, la risposta che hai scelto non è più rilevante. Dovresti aggiornare la tua scelta alla risposta di @ iPixFolio se puoi. –

+0

Funzionerà iOS7 e 6. Perché non funziona in ios8? –

risposta

26

Ho ottenuto che questo funzioni utilizzando un file .manifest in un UIWebView. Ho scoperto il trucco nei forum degli sviluppatori Apple.

è necessario fornire il tipo mime appropriato per il file manifest: deve essere di tipo "text/cache-manifest" - se è qualcos'altro, quindi non si otterranno i file nella cache.

è possibile utilizzare Web-Sniffer a http://web-sniffer.net/ per esaminare le intestazioni restituite dal server.

se si utilizza file .htaccess sul server web, quindi aggiungere la seguente riga al file .htaccess:

AddType text/cache-manifest .manifest 

assicurarsi di svuotare la cache del browser dopo aver fatto questa modifica per vedere l'effetto.

HTH Mark

edit: questo è supportata solo su iOS 4.0 e versioni successive. Avrete bisogno di implementare il proprio meccanismo di caching per iOS 2.xe 3.x :-(

+0

Molto interessante, ma il bisogno di iOS4 è ancora un rompicapo in questo momento per molti sviluppatori. Ma un passo nella giusta direzione di sicuro. –

+4

Suggerimento extra per chi cerca: non è necessario uno sniffer web per questo. Basta attivare una sessione terminale e rilasciare questo: 'arricciatura -I http: // YOUR_DOMAIN/PATH/TO/CACHE_MANIFEST' – Ben

+3

Non è più un interruttore automatico. –

3

È possibile utilizzare il parametro cachePolicy sul NSURLRequest.

request = [NSURLRequest requestWithURL:[NSURL URLWithString:reqString] cachePolicy:NSURLRequestReturnCacheDataDontLoad timeoutInterval: 10.0]; 

documentato here.

+0

Questo non funziona. Ecco come faccio a sapere: ho creato un file di esempio con un manifest di cache e ho caricato questo file in 3 browser: (1) Firefox (2) mobile Safari, (3) un UIWebView usando NSURLRequestReturnCacheElseLoad (se uso DontLoad allora _never_ carichi). Quindi modifico un'immagine memorizzata nella cache sul server. Firefox e Safari mostrano correttamente la vecchia immagine; il mio UIWebView ottiene la nuova immagine. – Tyler

+0

Oggi ho funzionato (SDK 5). Grazie – Tiago

1

hai provato a creare un oggetto NSURLCache personalizzato e utilizzare il setSharedURLCache: metodo, come raccomandato nella documentazione:

"Applicazioni con esigenze più specifiche possibile creare un oggetto NSURLCache personalizzato e impostarlo come l'istanza di cache condivisa utilizzando setSharedURLCache: "

+1

Sì, ho. Non causa il manifest della cache, anche se puoi usare quella tecnica per provare a creare la tua cache - ma questo è più complicato di come sembra, perché il framework NSURL rifiuta alcune risposte memorizzate nella cache per ragioni sconosciute. – Tyler

+0

Ho notato la stessa cosa. È piuttosto schizzinoso. –

2

UIWebView 's non può (o non utilizzerà) l'appcache HTML5. Semplicemente no. Forse in iPhone OS 4.0.

Ma quello che puoi fare è recuperare tutti i file te stesso con le chiamate di rete (o semplicemente averli nel tuo pacchetto di app) e caricare la webview con un URL locale che punta al tuo file HTML locale, che può avere URL relativi a risorse locali.

Non esiste un modo semplice "funziona" per far sì che ciò accada.

+3

Dopo molte indagini, sono d'accordo sul fatto che semplicemente non esiste un modo semplice per risolvere questo problema. Il più vicino che potevo ottenere era implementare la mia sottoclasse di NSURLCache e impostarla come cache. Tuttavia, nonostante tutto ciò, ho scoperto che spesso i miei risultati nella cache sono stati respinti dal sistema operativo per ragioni che per me erano opache. Sembra che il sistema operativo sia estremamente schizzinoso nell'accettare le risposte memorizzate nella cache, indipendentemente dalla politica della cache o da altre modifiche ai parametri che ho tentato. Abbastanza frustrante con cui lavorare! – Tyler

+0

La risposta qui sotto indica che questo può funzionare in IOS 4.2 –

+0

Ottenuto questo lavoro in iOS 5.0 –

1

stavo sperimentando lo stesso problema Anche se ho usato:.

[NSMutableURLRequest requestWithURL:url cachePolicy:NSURLRequestReturnCacheDataElseLoad timeoutInterval:30.0]; 

non sembrava volere di utilizzare i dati memorizzati nella cache. Significato costantemente fatto la richiesta al mio webservice per recuperare il contenuto più recente e quindi reso caching inutile.


ho trovato un work-around. Quando si carica l'URL nel UIWebView utilizzare il codice seguente:

NSString *html = [NSString stringWithFormat:@"<html><head><script type=\"text/javascript\">location.href='%@';</script></head><body></body></html>", [[currentURLRequest URL] absoluteString]]; 
[self.webView loadHTMLString:html baseURL:nil]; 

Questo è stato testato sul sistema operativo 4.2, poiché utilizzo manifest per gestire la memorizzazione nella cache (HTML5). C'è una grande possibilità che non funzioni su OS 2.x/3.x, questo deve essere confermato.

I contro sull'utilizzo di questo metodo è che non è possibile inviare alcun dato POST con la richiesta.

Spero che questo aiuti chiunque.


è comunque necessario inviare la richiesta con 'cachePolicy: NSURLRequestReturnCacheDataElseLoad' altrimenti sarà ancora non funziona.

+0

Che cosa dovrei fare se sto caricando un UIWebView da un NSString del corpo html pre-generato che fa riferimento ai file che ho bisogno di memorizzare nella cache? Fondamentalmente suppongo che potrebbe essere una chiamata Java diversa? Qualche idea? – Marius

Problemi correlati