UIWebView или WKWebkit для JavaScript?

Я хочу загрузить запрошенную веб-страницу и получить доступ к элементам DOM, чтобы вернуть значение из одного из узлов. У меня есть JavaScript, который делает это. Вопрос в том, какой лучший способ вернуть значение моему приложению. Я вижу, что UIWebView имеет функцию

stringByEvaluatingJavaScriptFromString

и WKWebKit имеет функцию

функция оценкиJavaScript(javaScriptString: String!, завершениеHandler: ((AnyObject!, NSError!) -> Void))!)

Хорошо, в чем основная разница между ними и что лучше и почему для моего варианта использования?


person RyanTCB    schedule 25.07.2015    source источник


Ответы (1)


В общем, WKWebView несколько отличается от UIWebView.

  • Он использует тот же движок Javascript, что и Safari, поэтому он значительно быстрее оценивает Javascript (используется своевременная компиляция для компиляции вашего скрипта в машинный код перед его запуском).
  • Он поддерживается только на iOS8 и выше, поэтому не будет работать на старых платформах.
  • Он выполняется в отдельном процессе, поэтому сбои в коде WKWebView не остановят все ваше приложение.

Чтобы ответить на ваш конкретный вопрос, UIWebView stringByEvaluatingJavaScriptFromString блокирует ваше приложение, ожидая запуска вашего кода, и поэтому является синхронным. Напротив, поскольку код WKWebView выполняется в другом процессе, вы должны взаимодействовать с ним асинхронно; вы отправляете свой запрос на запуск Javascript процессу WebKit, и ваш обработчик завершения запускается, когда оценка JavaScript завершена и результаты готовы. Тем временем поток, вызвавший evaluateJavaScript, продолжит выполнение другого кода.

person KJ Tsanaktsidis    schedule 25.07.2015
comment
Превосходное объяснение. Это в Apple docs или ваши личные знания? - person RyanTCB; 25.07.2015
comment
В документах явно указано, что [WKWebView AssessmentJavaScript] является асинхронным, но я не могу найти официального упоминания о трех пунктах, которые я сделал выше прямо сейчас. Хотя они определенно верны. Вы можете увидеть сами процессы WebKit в инструментах, например - person KJ Tsanaktsidis; 25.07.2015
comment
Я даже не могу найти, где написано, что это асинхронно. Я думаю, именно поэтому мы пришли к SO :) - person RyanTCB; 25.07.2015