Swift iOS Cache WKWebView Inhalte für die Offline-Ansicht

8

Wir versuchen, den Inhalt (HTML) von WKWebView in einem persistenten Speicher (NSUserDefaults, CoreData oder Datei) zu speichern. Der Benutzer kann denselben Inhalt sehen, wenn er die Anwendung ohne Internetverbindung erneut eingibt. WKWebView verwendet NSURLProtocol nicht wie UIWebView (siehe hier ).

Obwohl ich Beiträge gesehen habe, die "Der Offline-Anwendungscache ist in WKWebView nicht aktiviert." (Apple Dev-Foren), ich weiß, dass eine Lösung existiert.

Ich habe von zwei Möglichkeiten erfahren, aber ich konnte sie nicht zum Laufen bringen:

1) Wenn ich eine Website in Safari für Mac öffne und Datei & gt; & gt; Speichern unter, es erscheint die folgende Option im Bild unten. Für Mac-Apps gibt es [[[webView mainFrame] dataSource] webArchive], aber auf UIWebView oder WKWebView gibt es keine solche API. Aber wenn ich eine .webarchive-Datei in Xcode auf WKWebView lade (wie die, die ich von Mac Safari erhalten habe), dann wird der Inhalt korrekt angezeigt (HTML, externe Bilder, Video-Vorschau), wenn keine Internetverbindung besteht. Die .webarchive-Datei ist eigentlich eine Plist (Eigenschaftsliste). Ich habe versucht, ein Mac-Framework zu verwenden, das eine .webarchive-Datei erstellt, aber es war unvollständig.

2) Ich habe den HTML-Code in webView erhalten: didFinishNavigation, speichert aber keine externen Bilder, css, javascript

%Vor%

Wir kämpfen über eine Woche und es ist ein Hauptmerkmal für uns. Jede Idee wird wirklich geschätzt.

Danke!

    
Cristi Ghinea 27.03.2016, 10:49
quelle

2 Antworten

0

Ich bin mir nicht sicher, ob Sie nur die Seiten zwischenspeichern möchten, die bereits besucht wurden, oder ob Sie bestimmte Anfragen haben, die Sie zwischenspeichern möchten. Ich arbeite gerade an letzterem. Also werde ich dazu sprechen. Meine URLs werden dynamisch aus einer API-Anfrage generiert. Aus dieser Antwort setze ich requestPaths mit den Nicht-Image-URLs und mache dann eine Anfrage für jede der URLs und cache die Antwort zwischen. Für die Bild-URLs habe ich die Kingfisher -Bibliothek verwendet, um die Bilder zwischenzuspeichern. Ich habe bereits meinen freigegebenen Cache urlCache = URLCache.shared in meinem AppDelegate eingerichtet. Und ich habe den benötigten Speicher zugewiesen: urlCache = URLCache(memoryCapacity: <setForYourNeeds>, diskCapacity: <setForYourNeeds>, diskPath: "urlCache") Dann rufe einfach startRequest(:_) für jede der URLs in requestPaths auf. (Kann im Hintergrund ausgeführt werden, wenn es nicht sofort benötigt wird)

%Vor%

Ich verwende Alamofire für die Netzwerkanforderung mit einem CachingSessionManager, der mit den entsprechenden Headern konfiguriert ist. Also in meiner WebService Klasse habe ich:

%Vor%

Dann lade ich in der Webview-Delegate-Methode die cachedResponse. Ich verwende eine Variable handlingCacheRequest , um eine Endlosschleife zu vermeiden.

%Vor%

Natürlich möchten Sie es auch behandeln, wenn es auch einen Ladefehler gibt.

%Vor%

Ich hoffe, das hilft. Das einzige, was ich noch herausfinden möchte, ist, dass die Bild-Assets nicht offline geladen werden. Ich denke, dass ich eine separate Anfrage für diese Bilder machen muss und einen Verweis auf diese Bilder lokal aufbewahren muss. Nur ein Gedanke, aber ich werde dies aktualisieren, wenn ich das geschafft habe.

AKTUALISIERT mit Bildern, die offline mit dem untenstehenden Code geladen werden Ich habe die Kanna Bibliothek verwendet, um meine HTML-Zeichenfolge aus meiner zwischengespeicherten Antwort zu analysieren, die URL im style= background-image: -Attribut des div zu finden, regex zu verwenden, um die URL zu erhalten (was auch der Schlüssel für Kingfisher ist) cached image), holte das zwischengespeicherte Bild und modifizierte dann die CSS, um die Bilddaten zu verwenden (basierend auf diesem Artikel: Ссылка ) ), und dann die Webansicht mit dem modifizierten HTML geladen. (Puh!) Es war ziemlich der Prozess und vielleicht gibt es einen leichteren Weg .. aber ich hatte es nicht gefunden. Mein Code wird aktualisiert, um alle diese Änderungen widerzuspiegeln. Viel Glück!

%Vor%     
FromTheStix 16.09.2017 00:08
quelle
-1

Ich würde empfehlen, die Machbarkeit der Verwendung des App-Cache zu prüfen, der jetzt in WKWebView ab iOS 10 unterstützt wird: Ссылка

    
Andrew Ebling 02.06.2017 16:21
quelle

Tags und Links