Laden Sie für frühere iOS 8-Betas eine lokale Web-App (im Bundle) und sie funktioniert für beide UIWebView
und WKWebView
, und ich habe sogar ein Web-Spiel mit der neuen portiertWKWebView
API .
var url = NSURL(fileURLWithPath:NSBundle.mainBundle().pathForResource("car", ofType:"html"))
webView = WKWebView(frame:view.frame)
webView!.loadRequest(NSURLRequest(URL:url))
view.addSubview(webView)
Aber in Beta 4 habe ich gerade einen leeren weißen Bildschirm bekommen (UIWebView
funktioniert immer noch), es sieht so aus, als ob nichts geladen oder ausgeführt wird. Ich habe einen Fehler im Protokoll gesehen:
Es konnte keine Sandbox-Erweiterung für erstellt werden /
Irgendeine Hilfe, um mich in die richtige Richtung zu führen? Vielen Dank!
Antworten:
Sie haben endlich den Fehler behoben! Jetzt können wir verwenden
-[WKWebView loadFileURL:allowingReadAccessToURL:]
. Anscheinend war das Update in WWDC 2015 Video 504 Einführung in Safari View Controller einige Sekunden wertFür iOS8 ~ iOS10 (Swift 3)
Wie Dan Fabulishs Antwort besagt, handelt es sich um einen Fehler von WKWebView,
der anscheinend nicht in Kürze behoben werden kannund wie er sagte, gibt es eine :)Ich antworte nur, weil ich hier die Problemumgehung zeigen wollte. Der IMO-Code unter https://github.com/shazron/WKWebViewFIleUrlTest enthält viele nicht verwandte Details, an denen die meisten Menschen wahrscheinlich nicht interessiert sind.
Die Problemumgehung besteht aus 20 Codezeilen, Fehlerbehandlung und Kommentaren, kein Server erforderlich :)
Und kann verwendet werden als:
quelle
let orgFolder = NSBundle.mainBundle().resourcePath! + "/www"; var newFilePath = pathForBuggyWKWebView(orgFolder) self.loadingWebView!.loadRequest(NSURLRequest(URL: NSURL.fileURLWithPath(newFilePath!+"/Loading.html")!))
WKWebView kann über seine
loadRequest:
Methode keinen Inhalt aus Datei: URLs laden . http://www.openradar.me/18039024Sie können Inhalte über laden
loadHTMLString:
, aber wenn Ihre baseURL eine Datei: URL ist, funktioniert sie immer noch nicht.iOS 9 verfügt über eine neue API, die das tut, was Sie wollen
[WKWebView loadFileURL:allowingReadAccessToURL:]
.Es gibt eine Problemumgehung für iOS 8 , die von shazron in Objective-C unter https://github.com/shazron/WKWebViewFIleUrlTest demonstriert wurde, um Dateien in
/tmp/www
diese zu kopieren und von dort zu laden .Wenn Sie in Swift arbeiten, können Sie stattdessen das Beispiel von nachos4d ausprobieren . (Es ist auch viel kürzer als Shazrons Beispiel. Wenn Sie also Probleme mit Shazrons Code haben, probieren Sie es stattdessen aus.)
quelle
/tmp/www/
. Verwenden SieNSTemporaryDirectory()
undNSFileManager
, um einwww
Verzeichnis zu erstellen (da es standardmäßig kein solches Verzeichnis gibt). Dann kopieren Sie Ihre Datei dort und lesen Sie jetzt diese Datei :)Ein Beispiel für die Verwendung von [WKWebView loadFileURL: allowReadAccessToURL:] unter iOS 9 .
Wenn Sie den Webordner in ein Projekt verschieben, wählen Sie "Ordnerreferenzen erstellen".
Verwenden Sie dann Code, der ungefähr so aussieht (Swift 2):
Verwenden Sie in der HTML-Datei folgende Dateipfade
so nicht
Ein Beispiel für ein Verzeichnis, das in ein xcode-Projekt verschoben wird.
quelle
Temporäre Problemumgehung: Ich verwende GCDWebServer , wie von GuidoMB vorgeschlagen.
Ich finde zuerst den Pfad meines gebündelten Ordners "www /" (der eine "index.html" enthält):
... dann starte es so:
Um es zu stoppen:
Die Leistung scheint auch auf einem iPad 2 in Ordnung zu sein.
Ich habe einen Absturz bemerkt, nachdem die App in den Hintergrund getreten ist, also stoppe ich sie auf
applicationDidEnterBackground:
undapplicationWillTerminate:
; Ich starte / starte es aufapplication:didFinishLaunching...
und neuapplicationWillEnterForeground:
.quelle
WKWebView
die sich daraus ergebenUIWebView
. Könnte auch bei der alten API bleiben, bis dies behoben ist.Dies löste das Problem für mich iOS 8.0+ dev.apple.com
auch das scheint gut zu funktionieren ...
quelle
allowFileAccessFromFileURLs
Ansatz stürzt abNSUnknownKeyException
.Neben den von Dan Fabulich erwähnten Lösungen ist XWebView eine weitere Problemumgehung . [WKWebView loadFileURL: allowReadAccessToURL:] wird durch Erweiterung implementiert .
quelle
Ich kann noch keinen Kommentar abgeben, daher poste ich dies als separate Antwort.
Dies ist eine Objective-C-Version der nacho4d-Lösung . Die beste Problemumgehung, die ich bisher gesehen habe.
quelle
Für den Fall, dass Sie versuchen, ein lokales Bild in der Mitte einer größeren HTML-Zeichenfolge wie: anzuzeigen
<img src="file://...">
, wird es immer noch nicht auf dem Gerät angezeigt. Daher habe ich die Bilddatei in NSData geladen und konnte sie anzeigen, indem ich die src-Zeichenfolge durch ersetzte die Daten selbst. Beispielcode zum Erstellen der HTML-Zeichenfolge zum Laden in WKWebView. Das Ergebnis ersetzt das, was in den Anführungszeichen von src = "" enthalten ist:Schnell:
Ziel c:
quelle
result += "data:image/" + attachmentType + ";base64," + base64String
WKWebView
als<img>
HTML-Zeichenfolge in den Ordner lade.Ich benutze das unten. Ich arbeite an einigen zusätzlichen Dingen, aber Sie können sehen, wo ich die loadRequest auskommentiert habe und den loadHTMLString-Aufruf ersetze. Hoffe das hilft bis sie den Fehler behoben haben.
quelle
Für wen muss dieses Problem unter iOS8 umgehen:
Wenn Ihre Seite nicht kompliziert ist, können Sie die Seite als Einzelseitenanwendung erstellen.
Mit anderen Worten, um alle Ressourcen in die HTML-Datei einzubetten.
So gehen Sie vor: 1. Kopieren Sie den Inhalt Ihrer js / css-Datei in / tags in der HTML-Datei. 2. konvertieren Sie Ihre Bilddateien in svg, um die entsprechenden zu ersetzen. 3. Laden Sie die Seite wie zuvor, indem Sie beispielsweise [webView loadHTMLString: baseURL:] verwenden
Es war ein bisschen anders als das Stylen eines SVG-Bildes, aber es sollte Sie nicht so sehr blockieren.
Es schien, dass die Leistung beim Rendern von Seiten etwas abnahm, aber es war wert, eine so einfache Problemumgehung unter iOS8 / 9/10 zu haben.
quelle
In derselben Zeile von GCDWebServer verwende ich SImpleHttpServer ( http://www.andyjamesdavies.com/blog/javascript/simple-http-server-on-mac-os-x-in-seconds ) und lade dann die Anforderung mit dem lokalen Host URL. Bei diesem Ansatz müssen Sie keine Bibliothek hinzufügen, aber die Website-Dateien befinden sich nicht im Bundle, sodass sie nicht geliefert werden können. Aus diesem Grund wäre dies für Debug-Fälle besser geeignet.
quelle
Ich habe es geschafft, den PHP-Webserver unter OS X zu verwenden. Das Kopieren in das temporäre Verzeichnis / www hat bei mir nicht funktioniert. Der Python SimpleHTTPServer beschwerte sich darüber, dass er MIME-Typen lesen wollte, wahrscheinlich ein Sandbox-Problem.
Hier ist ein Server mit
php -S
:quelle
@ Nacho4d Lösung ist gut. Ich möchte es ein wenig ändern, aber ich weiß nicht, wie ich es in Ihrem Beitrag ändern soll. Also habe ich es hierher gebracht, ich hoffe es macht dir nichts aus. Vielen Dank.
Wenn Sie einen WWW-Ordner haben, gibt es viele andere Dateien wie PNG, CSS, JS usw. Dann müssen Sie alle Dateien in den Ordner tmp / www kopieren. Sie haben beispielsweise einen WWW-Ordner wie diesen:
dann in Swift 2.0:
Die Funktion fileURLForBuggyWKWebView8 wird von @ nacho4d kopiert:
quelle
Versuchen Sie es mit
Scheint, es funktioniert immer noch. Noch.
quelle