2009-10-08 8 views
19

Ich möchte in der Lage sein, das HTML5-Cache-Manifest zu verwenden, um Bilder lokal auf einem iPhone zu speichern, das die Seite über eine UIWebView innerhalb einer App besucht.Html5-Cache-Manifest in einem UIWebView?

Ich habe ein Beispiel eingerichtet, das meiner Meinung nach den Spezifikationen entspricht und anscheinend in Safari 4 und Mobile Safari funktioniert, aber nicht in meiner App UIWebView.

Das Beispiel html wird auf http://bynomial.com/html5/clock3.html eingerichtet.

Dies ist sehr ähnlich zu der Probe in der HTML5 draft standard zur Verfügung gestellt. Hier

ist die gesamte (nicht Vorlage) Code der Beispielanwendung ich für Tests mit:

- (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]; 
} 

ich ein paar ähnliche Fragen auf Stackoverflow überprüft haben, aber sie scheinen nicht zu Stellen Sie Informationen zur Verfügung, um dies zu lösen. Zum Beispiel bin ich mir ziemlich sicher, dass die Dateien, die ich zwischenspeichern möchte, nicht zu groß sind, da sie nur ein paar kleine Textdateien sind (Weg < 25k).

Irgendwelche Ideen, wie man das zum Laufen bringt?

+0

Tyler, Die von Ihnen gewählte Antwort ist nicht mehr relevant. Sie sollten Ihre Wahl auf @ iPixFolio's Antwort aktualisieren, wenn Sie können. –

+0

Funktioniert iOS7 und 6. Warum nicht in ios8 arbeiten? –

Antwort

26

Ich habe dies mit einer .manifest-Datei in einem UIWebView arbeiten. Ich habe den Trick in den Apple Entwicklerforen entdeckt.

Sie müssen den richtigen Mime-Typ für die Manifest-Datei liefern: Es muss vom Typ "Text/Cache-Manifest" sein - wenn es etwas anderes ist, dann werden Sie Ihre Dateien nicht zwischengespeichert.

können Sie Web-Sniffer bei http://web-sniffer.net/ verwenden, um die Header von Ihrem Server angezeigt zu sehen.

wenn Sie .htaccess-Dateien auf Ihrem Webserver verwenden, dann fügen Sie die folgende Zeile in die .htaccess-Datei:

AddType text/cache-manifest .manifest 

stellen Sie sicher, nach dieser Änderung den Browser-Cache löschen den Effekt zu sehen.

HTH Mark

edit: dies nur auf iOS 4.0 unterstützt und höher. Sie müssen Ihren eigenen Caching-Mechanismus für iOS 2.x und 3.x :-(

+0

Sehr cool, aber iOS4 ist immer noch ein Deal Breaker für viele Entwickler. Aber ein Schritt in die richtige Richtung. –

+4

Extra-Tipp für jeden Suchenden: Sie brauchen dafür keinen Web-Sniffer. Starten Sie einfach eine Terminalsitzung und geben Sie folgendes aus: 'curl -I http: // YOUR_DOMAIN/PATH/TO/CACHE_MANIFEST' – Ben

+3

Es ist kein Deal Breaker mehr. –

3

Sie können den Parameter cachePolicy für NSURLRequest verwenden.

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

dokumentiert here.

+0

Dies funktioniert nicht. Hier ist, wie ich weiß: Ich baute eine Beispieldatei mit einem Cache-Manifest, und ich lud diese Datei in 3 Browsern: (1) Firefox (2) mobile Safari, (3) ein UIWebView mit NSURLRequestReturnCacheElseLoad (wenn ich DontLoad dann es _never_ verwende Ladungen). Dann ändere ich ein zwischengespeichertes Bild auf dem Server. Firefox und Safari zeigen beide korrekt das alte Bild an; Mein UIWebView erhält das neue Bild. – Tyler

+0

Ich habe das heute funktioniert (SDK 5). Danke – Tiago

1

Haben Sie eine angepasste NSURLCache Objekt zu erstellen versucht, und verwenden Sie die setSharedURLCache: Methode, wie in der Dokumentation empfohlen:

„Anwendungen mit mehr spezifischen Bedürfnissen kann ein benutzerdefiniertes NSURLCache-Objekt erstellen und es als Shared-Cache-Instanz festgelegt mit setSharedURLCache: "

+1

Ja habe ich. Es führt nicht dazu, dass das Cache-Manifest funktioniert, obwohl Sie mit dieser Technik versuchen können, Ihren eigenen Cache zu erstellen - aber das ist kniffliger, als es sich anhört, weil das NSURL-Framework einige zwischengespeicherte Antworten aus unbekannten Gründen zurückweist. – Tyler

+0

Ich habe das gleiche bemerkt. Es ist ziemlich knifflig. –

2

UIWebView kann nicht (oder wird nicht) den HTML5 appcache verwenden. Sie tun es einfach nicht. Vielleicht in iPhone OS 4.0.

Aber Sie können alle Dateien selbst mit Netzwerkaufrufen abrufen (oder einfach in Ihrem App-Bundle haben) und die Webansicht mit einer lokalen URL laden, die auf Ihre lokale HTML-Datei verweist, die relative URLs enthalten kann lokale Vermögenswerte.

Es gibt keine super einfache "es funktioniert einfach" Möglichkeit, dies zu erreichen, jedoch.

+3

Nach vielen Nachforschungen stimme ich zu, dass es einfach keinen einfachen Weg gibt, dieses Problem zu lösen. Der nächste, den ich bekommen konnte, war, meine eigene Unterklasse von NSURLCache zu implementieren und diese als Cache festzulegen. Aber selbst bei all dem stellte ich fest, dass meine gecachten Ergebnisse oft aus Gründen, die für mich undurchsichtig waren, vom OS abgelehnt wurden. Es scheint, dass das Betriebssystem extrem wählerisch ist, zwischengespeicherte Antworten zu akzeptieren, egal welche Cache-Richtlinie oder andere Parameter-Optimierungen ich versuchte. Ziemlich frustrierend, mit zu arbeiten! – Tyler

+0

Die Antwort unten zeigt an, dass dies in IOS funktionieren kann 4.2 –

+0

Diese Arbeit in iOS 5.0 erhalten –

1

ich erleben das gleiche Problem implementieren Obwohl ich verwendet:.

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

Es ist nicht zu wollen schienen die im Cache gespeicherten Daten zu verwenden. Bedeutung es ständig die Anfrage an meine Webservice machte die neuesten Inhalte und damit gemacht Caching nutzlos.


ich fand eine Behelfslösung. Beim Laden der URL in der UIWebView verwenden die zum abrufen folgender Code:

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]; 

Dies wurde auf dem OS 4.2 getestet, da ich das Manifest verwende, um das Caching (HTML5) zu behandeln. Es besteht die große Chance, dass es unter OS 2.x/3.x nicht funktioniert. Dies muss bestätigt werden.

Die Nachteile bei der Verwendung dieser Methode ist, dass Sie keine POST-Daten mit Ihrer Anfrage senden können.

Hoffe das hilft jedem.


Sie müssen noch die Anforderung mit schicken ‚cachepolicy: NSURLRequestReturnCacheDataElseLoad‘ sonst wird es immer noch nicht.

+0

Was müsste ich tun, wenn ich ein UIWebView von einem vorgenerierten HTML Body NSString lade, der auf die Dateien verweist, die ich im Cache speichern muss? Grundsätzlich gehe ich davon aus, dass es sich um einen anderen Java-Aufruf handelt. Irgendwelche Ideen? – Marius