W przypadku poprzednich wersji beta systemu iOS 8 załaduj lokalną aplikację internetową (w pakiecie) i działa ona dobrze zarówno w przypadku, jak UIWebView
i WKWebView
, a nawet przeportowałem grę internetową za pomocą nowego WKWebView
interfejsu API.
var url = NSURL(fileURLWithPath:NSBundle.mainBundle().pathForResource("car", ofType:"html"))
webView = WKWebView(frame:view.frame)
webView!.loadRequest(NSURLRequest(URL:url))
view.addSubview(webView)
Ale w wersji beta 4 po prostu pojawił się pusty biały ekran ( UIWebView
nadal działa), wygląda na to, że nic nie jest ładowane ani wykonywane. Widziałem błąd w logu:
Nie udało się utworzyć rozszerzenia piaskownicy dla /
Jakaś pomoc, która poprowadzi mnie we właściwym kierunku? Dzięki!
Odpowiedzi:
W końcu rozwiązali błąd! Teraz możemy użyć
-[WKWebView loadFileURL:allowingReadAccessToURL:]
. Najwyraźniej poprawka była warta kilka sekund w wideo WWDC 2015 504 Przedstawiamy kontroler Safari ViewDla iOS8 ~ iOS10 (Swift 3)
Jak podaje odpowiedź Dana Fabulisha, jest to błąd WKWebView,
który najwyraźniej nie zostanie rozwiązany w najbliższym czasiei jak powiedział, istnieje obejście :)Odpowiadam tylko dlatego, że chciałem pokazać tutaj pracę. Kod IMO pokazany na https://github.com/shazron/WKWebViewFIleUrlTest jest pełen niepowiązanych szczegółów, którymi większość ludzi prawdopodobnie nie jest zainteresowana.
Obejście to 20 linii kodu, obsługa błędów i komentarze, bez serwera :)
I może być używany jako:
źródło
let orgFolder = NSBundle.mainBundle().resourcePath! + "/www"; var newFilePath = pathForBuggyWKWebView(orgFolder) self.loadingWebView!.loadRequest(NSURLRequest(URL: NSURL.fileURLWithPath(newFilePath!+"/Loading.html")!))
WKWebView nie może załadować treści z pliku: adresy URL za pomocą swojej
loadRequest:
metody. http://www.openradar.me/18039024Możesz załadować zawartość przez
loadHTMLString:
, ale jeśli twój baseURL jest plikiem: URL, to nadal nie będzie działać.iOS 9 ma nowego API, które będą robić to, co chcesz,
[WKWebView loadFileURL:allowingReadAccessToURL:]
.Istnieje obejście dla iOS 8 , pokazane przez shazrona w Objective-C tutaj https://github.com/shazron/WKWebViewFIleUrlTest, aby skopiować pliki
/tmp/www
i załadować je stamtąd .Jeśli pracujesz w Swift, możesz zamiast tego wypróbować sample nachos4d . (Jest również znacznie krótszy niż próbka shazrona, więc jeśli masz problem z kodem shazrona, spróbuj zamiast tego).
źródło
/tmp/www/
. UżyjNSTemporaryDirectory()
i,NSFileManager
aby utworzyćwww
katalog (ponieważ domyślnie nie ma takiego katalogu). Następnie skopiuj tam swój plik i przeczytaj ten plik :)Przykład użycia [WKWebView loadFileURL: allowedReadAccessToURL:] na iOS 9 .
Kiedy przenosisz folder sieciowy do projektu, wybierz „Utwórz odniesienia do folderów”
Następnie użyj kodu podobnego do tego (Swift 2):
W pliku html użyj takich ścieżek plików
nie tak jak to
Przykład katalogu, który został przeniesiony do projektu Xcode.
źródło
Tymczasowe obejście: używam GCDWebServer , zgodnie z sugestią GuidoMB.
Najpierw znajduję ścieżkę do mojego folderu „www /” (który zawiera „index.html”):
... a następnie uruchom to tak:
Aby to zatrzymać:
Wydajność wydaje się dobra, nawet na iPadzie 2.
Zauważyłem awarię po tym, jak aplikacja przeszła w tło, więc zatrzymuję ją
applicationDidEnterBackground:
iapplicationWillTerminate:
; Uruchamiam / restartuję go naapplication:didFinishLaunching...
iapplicationWillEnterForeground:
.źródło
WKWebView
zawiera ponadUIWebView
. Równie dobrze można trzymać się starego interfejsu API, dopóki nie zostanie to naprawione.To rozwiązało problem dla mnie iOS 8.0+ dev.apple.com
to też wydaje się działać dobrze ...
źródło
allowFileAccessFromFileURLs
podejście ulega awarii zNSUnknownKeyException
.Oprócz rozwiązań wspomnianych przez Dana Fabulicha, XWebView to kolejne obejście. [WKWebView loadFileURL: allowReadAccessToURL:] jest implementowane poprzez rozszerzenie .
źródło
Nie mogę jeszcze komentować, więc zamieszczam to jako osobną odpowiedź.
To jest obiektywna wersja rozwiązania nacho4d . Najlepsze obejście, jakie do tej pory widziałem.
źródło
W przypadku, gdy próbujesz wyświetlić lokalny obraz w środku większego ciągu HTML, takiego jak
<img src="file://...">
:, nadal nie pojawia się on na urządzeniu, więc załadowałem plik obrazu do NSData i mogłem go wyświetlić, zastępując ciąg src ciągiem same dane. Przykładowy kod ułatwiający tworzenie ciągu znaków HTML do załadowania do WKWebView, gdzie wynik zastąpi to, co znajduje się w cudzysłowie src = "":Szybki:
Cel C:
źródło
result += "data:image/" + attachmentType + ";base64," + base64String
WKWebView
jako plik<img>
HTMLstring.Używam poniżej. Ma kilka dodatkowych rzeczy, nad którymi pracuję, ale możesz zobaczyć, gdzie skomentowałem loadRequest i zastępuję wywołanie loadHTMLString. Mam nadzieję, że to pomoże, dopóki nie naprawią błędu.
źródło
Kto musi obejść ten problem w systemie iOS8:
Jeśli Twoja strona nie jest skomplikowana, możesz zdecydować się na utworzenie jej jako aplikacji jednostronicowej.
Innymi słowy, aby osadzić wszystkie zasoby w pliku html.
Aby to zrobić: 1. skopiuj zawartość swojego pliku js / css odpowiednio do / tags w pliku html; 2. przekonwertować pliki graficzne do formatu svg, aby zastąpić odpowiednio. 3. załaduj stronę jak poprzednio, używając na przykład [webView loadHTMLString: baseURL:]
To było trochę inne niż stylizowanie obrazu svg, ale nie powinno Cię tak bardzo blokować.
Wydawało się, że wydajność renderowania strony nieco spadła, ale warto było mieć tak proste obejście działające pod iOS8 / 9/10.
źródło
W tym samym wierszu GCDWebServer używam SImpleHttpServer ( http://www.andyjamesdavies.com/blog/javascript/simple-http-server-on-mac-os-x-in-seconds ), a następnie loadRequest z lokalnym hostem url. Dzięki takiemu podejściu nie musisz dodawać żadnej biblioteki, ale pliki strony internetowej nie będą w pakiecie, więc nie będzie można ich dostarczyć. Z tego powodu byłoby to bardziej odpowiednie dla przypadków debugowania.
źródło
Udało mi się użyć serwera WWW PHP na OS X. Kopiowanie do katalogu tymczasowego / www nie działało. Python SimpleHTTPServer narzekał, że chce czytać typy MIME, prawdopodobnie z powodu piaskownicy.
Oto serwer używający
php -S
:źródło
@ Rozwiązanie nacho4d jest dobre. Chcę to trochę zmienić, ale nie wiem, jak to zmienić w Twoim poście. Więc umieściłem to tutaj, mam nadzieję, że nie masz nic przeciwko. dzięki.
W przypadku, gdy masz folder www, istnieje wiele innych plików, takich jak png, css, js itp. Następnie musisz skopiować wszystkie pliki do folderu tmp / www. na przykład masz taki folder www:
następnie w Swift 2.0:
funkcja fileURLForBuggyWKWebView8 jest kopiowana z @ nacho4d:
źródło
Spróbuj użyć
Wygląda na to, że nadal działa. Jeszcze.
źródło