Тактика для ускорения WKWebView рендеринга loadHTMLString-d контента?

Я экспериментировал с укладкой WKWebViews в UINavigationController как метод создания гибридного приложения, более родного, чем PhoneGap. Он широко работает - я подключаюсь к решениюPolicyForNavigationAction, когда WKWebView обращается к ссылке и нажимает новый ViewController со ссылкой, которую он хочет.

Но загрузка страницы идет медленно. Я сделал все, что мог придумать, чтобы ускорить его - это использование loadHTMLString, а не запрос на то, чтобы все было локально. Я даже пытался отключить CSS и JS, чтобы увидеть, ускоряет ли это, но не кубики. Он по-прежнему занимает не менее 500 мс для короткой, только HTML, локально хранимой страницы, которая появится в пустом WKWebView. Я могу сказать из отладки, что задержка не в чтении HTML с диска, а в времени между loadHTMLString() и didFinishNavigation().

Есть ли у кого-нибудь тактика для исправления этого? Я бы попытался предварительно загрузить представление, только я не знаю, какая ссылка пользователь собирается нажать, поэтому я не знаю, что делать.

Ответ 1

Временный ответ - у меня есть некоторый успех, создающий следующий вид заранее, затем используя evaluateJavaScript для запуска document.body.innerHTML = "content" - у него нет задержки на половину секунды. Конечно, это означает создание WKWebview раньше, чем в противном случае, но, надеюсь, это не убийца производительности.

Ответ 2

Обновить:

WKWebView и UIWebView задерживаются при первом запуске. Это более заметно при использовании WKWebView. Я реализовал класс, который подогревает веб-представления для решения этой проблемы. Вы можете найти Swift версию этого решения здесь: https://github.com/bernikovich/WebViewWarmUper

Оригинальный ответ:

Похоже, WKWebView/UIWebView задерживается при первом запуске. Я создал простой класс для повышения скорости загрузки веб-просмотра с прогревом. Вы можете попробовать пример проекта: https://github.com/bernikovich/NSTViewWarmuper (больше не доступно)

Ответ 3

Мой путь - это сделать менее родным и более доступным. 1. Разработайте одностраничное приложение, например http://m.ftchinese.com/phone.html 2. Свяжите все ресурсы (JS, CSS, Graphics as Base64) в один файл. 3. Сохраните этот файл в моем проекте Xcode и используйте этот файл для запуска приложения, установив baseURL как http://m.ftchinese.com/phone.html

Код здесь:

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)

Это имеет некоторые преимущества: 1. Я уже много лет работаю над веб-приложением, поэтому он очень стабилен. 2. Тот же подход можно использовать на Android, Windows Phone и Blackberry. 3. В SPA нет загрузки пейджинга. Он чувствует себя очень гладко.