11. Скорость выполнения JavaScript
SunSpider: https://www.webkit.org/perf/sunspider/sunspider.html
11
@ iPhone 5s, iOS 8.1
WKWebView
UIWebView
0 375 750 1125 1500
Время выполнения, мс
12. WKWebView
Бонус: “из коробки” получаем:
〉Навигация жестами
〉Звонок с другого устройства
〉Открытие в новой вкладке
〉Заголовок страницы
API diff: http://nshipster.com/wkwebkit/
12
29. NSURLProtocol (только UIWebView)
Управление сетевым стеком с помощью NSURLProtocol
https://tech.yandex.ru/events/yac/2013/talks/1076/
Можем реализовать:
〉Сжатие трафика
〉Поддержку новых форматов
WebP
WebM
…
29
30. Саади
«Два человека бесплодно трудились и
без пользы старались: тот, кто копил
богатство и не пользовался им, и тот,
кто учился наукам, но не применял их»
33. Prerendering, DNS prefetching
DNS-запросы: от 1мс до нескольких секунд
Prerendering: субъективное ускорение загрузки страниц
33
<link rel="prerender" href="http://example.org/index.html">
<link rel="dns-prefetch" href="http://host-to-prefetch.com">
34. 34
function YACPrerenderLinks() {
var results = [],
nodeList = document.querySelector("link[rel='prerender']");
!
for (var i = 0; i < nodeList.length; i++) {
var href = nodeList[i].getAttribute("href");
results.push(href);
}
return results.join();
}
!
function YACDNSPrefetchLinks() { ... }
35. Управление медиаконтентом
var YACAudioElementsList = [ ],
YACHTMLAudioElementPlay =
window.HTMLAudioElement.prototype.play;
!
function YACAddHTMLAudioElementToList(el) {
YACHTMLAudioElementsList.push(el);
}
!
window.HTMLAudioElement.prototype.play = function() {
YACAddHTMLAudioElementToList(this);
this.play = YACHTMLAudioElementPlay;
this.play();
}
35
36. 36
function YACPauseHTMLAudioElements() {
for (i = 0; i < YACHTMLAudioElementsList.length; i++) {
YACHTMLAudioElementsList[i].pause();
}
}
!
function YACResumePausedHTMLAudio() { ... }
42. 42
// 1. Перехватываем событие отправки формы
// Обработчик вызывается для каждой отправляемой формы
window.addEventListener("submit", YACFormSubmitHandler, false);
!
!
// 2. Сохраняем заполненные данные в обработчике события
function YACFormSubmitHandler(e) {
if (e.target.nodeName !== "FORM") {
return;
}
!
YACCollectLoginFormDataAndSendToNativeCode(e.target);
}
43. 43
// 3. Заполняем данные при загрузке страницы с такой же формой
function YACFillLoginFormWithData(
form,
usernameElementName, usernameValue,
passwordElementName, passwordValue) {
!
var usernameElement = form.querySelector(
"input[name='" + usernameElementName + "']");
usernameElement.value = usernameValue;
!
var passwordElement = form.querySelector(
"input[type='password'][name='" + passwordElementName + "']");
passwordElement.value = passwordValue;
}
47. Социальная авторизация
45
Реализация с помощью WebView:
Доступ к данным на странице авторизации!
Совет: не используйте WebView для социальной авторизации
48. Реализация с помощью OAuth
1. Регистрируем приложение
2. Отправляем запрос
https://oauth.yandex.ru/authorize?
response_type=token
& client_id=<идентификатор приложения>
3. Пользователь авторизуется и выдает разрешения для нашего приложения
4. Получаем данные в ответе
http://www.example.com/token#
access_token=<новый OAuth-токен>
& expires_in=<время жизни токена в секундах>
46
52. Что же получилось?
〉Мы разобрались в возможностях UIWebView и WKWebView
〉Научились писать “фичи” для веб-контента
〉Делаем пользователей счастливее
〉И все это — благодаря JavaScript!
49
69. // TODO:
〉Создать экземпляр CharacterAI
〉Передать персонаж в JavaScript окружение
〉Экспортировать необходимые методы
〉Сообщать о событиях (onIdle, onScannedEnemy…)
66
80. Материалы
〉WWDC 2014 Introducing the Modern WebKit API
〉nshipster.com/wkwebkit
〉tech.yandex.ru/events/yac/2013/talks/1076
〉WWDC 2013 Integrating JavaScript into Native Apps
〉trac.webkit.org/wiki/JavaScriptCore
〉github.com/WebKit/webkit
〉bit.ly/yac2014-ios-jstalks
76