2014-10-31 13 views
8

Eksperymentowałem z układaniem WKWebViews w UINavigationController jako metodą tworzenia aplikacji hybrydowej, która jest bardziej natywna niż PhoneGap. Działa to szeroko - przechwytuję metodę decisionPolicyForNavigationAction, gdy WKWebView uderza w łącze, a następnie przesyła nowy ViewController z żądanym łączem.Taktyka, aby przyspieszyć renderowanie WKWebView treści loadHTMLString-d?

Ale ładowanie strony jest wolne. Zrobiłem wszystko, co mogłem wymyślić, aby przyspieszyć - używa on loadHTMLString zamiast żądania, aby upewnić się, że wszystko jest lokalne - próbowałem nawet pozbyć się CSS i JS, aby sprawdzić, czy to przyspiesza, ale nie ma kości. Wciąż trwa co najmniej 500ms, aby krótka, tylko lokalnie przechowywana strona HTML pojawiła się w pustym WKWebView. Podczas debugowania mogę stwierdzić, że opóźnienie nie polega na odczytywaniu kodu HTML z dysku, ale na czasie między loadHTMLString() a didFinishNavigation().

Czy ktoś ma jakąś taktykę, aby to naprawić? Próbowałem wstępnie załadować widok, ale nie wiem, który link ma zamiar dotknąć, więc nie wiem, co załadować.

Odpowiedz

2

Odpowiedź tymczasowa - Mam pewien sukces, tworząc wcześniej widok z góry, a następnie używając evaluateJavaScript do uruchomienia document.body.innerHTML = "content" - nie ma opóźnienia pół sekundy. Oczywiście oznacza to utworzenie WKWebview wcześniej niż ja w przeciwnym razie, ale mam nadzieję, że nie jest to zabójca wydajności.

0

Moim sposobem jest przejście na mniej natywne i bardziej internetowe. 1. Opracuj aplikację z jedną stroną, taką jak http://m.ftchinese.com/phone.html 2. Połącz wszystkie zasoby (JS, CSS, Graphics jako Base64) w jeden plik. 3. Zapisz ten plik do mojego projektu Xcode i wykorzystać ten plik, aby uruchomić aplikację, ustawienie baseURL jak http://m.ftchinese.com/phone.html

kod tutaj:

let templatepath = NSBundle.mainBundle().pathForResource("index", ofType: "html")! 
let base = NSURL(string: "http://m.ftchinese.com") 
var s = NSString(contentsOfFile:templatepath, encoding:NSUTF8StringEncoding, error:nil)! 
self.webView!.loadHTMLString(s, baseURL:base) 

Ma to pewne zalety: 1. Mam już działał w aplikacji internetowej przez wiele lat, więc jest bardzo stabilny. 2. To samo podejście może być stosowane w systemach Android, Windows Phone i Blackberry. 3. SPA nie ma wczytywania stronicowania. To jest bardzo płynne.

1

Wygląda jak opóźnienia WKWebView/UIWebView przy pierwszym uruchomieniu. Stworzyłem prostą klasę do zwiększania prędkości ładowania widoku internetowego przy rozgrzewce. Możesz wypróbować przykładowy projekt: https://github.com/bernikowich/NSTViewWarmuper

+0

Próbowałem, że to naprawdę przydatne Timur –