Максим Сальников

@webmaxru

Фоновые сервисы в браузерах: Есть ли жизнь после закрытия вкладки?

Что доступно из фоновых сервисов сегодня

И как использовать это во благо пользователей

Максим Сальников

  • Организатор Mobile / Web / PWA митапов в Осло и Лондоне

  • Организатор конференций Mobile Era и ngVikings в Скандинавии

  • Google Dev Expert по веб-технологиям (Capabilities & Installability)

Ответственный за успех Azure-разработчиков в Microsoft

А что, если бы мы могли...

  • Поддерживать приложение и его данные в актуальном виде

  • Показывать запланированные уведомления, не заботясь о статусе подключения на тот момент

  • Переотправлять данные в случае их неудачной отправки из-за отсутствия сети

Не тревожа пользователя

Что такое фоновый сервис?

  • Исполняется в отдельном потоке

  • Обособленный жизненный цикл

  • Инициируется некоторыми событиями

Типы событий

  • Изменение состояния подключения к сети

  • Изменение статуса сетевого запроса

  • Основанные на таймерах

  • Явно отправленные из бэкенда

Сервис-воркер

Сервис-воркер

ОС

Браузер

Интернет

Апп

Событие

Событие

Событие

Событие

  • Отправить сообщение

  • Открыть вкладку с приложением

  • Показать уведомление

  • Выполнить произвольный код

Сообщение

DevTools -> Application

  • Установка сервис-воркера "на лету"

  • Управление интерфейсом платежных методов

DevTools -> Application

  • Единовременное событие при подключении к сети

  • Для организации переотправки запросов, сделанных офлайн

DevTools -> Application

  • Отвязывает процесс скачивания от жизненного цикла приложения

  • Привязывает скачанные данные к приложению

DevTools -> Application

  • Для запуска произвольного кода по сигналу с бэкенда

  • ...с обязательным показом уведомления

DevTools -> Application

  • События, вызываемые таймерами

(Triggers)

DevTools -> Application

Periodic Background Sync API

Notification Triggers API

Тайминг

Интервалы

Один раз

Возможности

Любой код

Уведомление

Окончательное решение по времени

Браузер

Разработчик

Статус подключения

Только онлайн

Не важен

Требования

Установленное приложение

Разрешенные уведомления

Заметность

Незаметно

Уведомление

Periodic background sync

const registration = await navigator.serviceWorker.ready;
if ('periodicSync' in registration) {

  registration.periodicSync.register('update-content', {
    
      // Интервал в один день
      minInterval: 24 * 60 * 60 * 1000
  })

}

main.js

Произвольный код

self.addEventListener('periodicsync', (event) => {
  if (event.tag === 'update-content') {
    
    // Не уверен - не запускай! Think before you sync!
    event.waitUntil(updateContent());
  }
});

service-worker.js

  • Тип подключения?

  • Режим экономии трафика?

  • Доступное место на устройстве?

Engagement Score Интервал Periodic Sync (часы)
NONE Никогда
MINIMAL

36

LOW

24

MEDIUM

24

HIGH

12

MAX

12

Интервалы в Chrome

Notification triggers

const registration = await navigator.serviceWorker.ready;
if ('showTrigger' in Notification.prototype) {
      
  // 5 секунд от "сейчас"
  const triggerTime =  Date.now() + 5 * 1000

  registration.showNotification('Notification Trigger Demo', {
    body: `Scheduled for ${new Date( triggerTime ).toLocaleTimeString()}`,
    showTrigger: new TimestampTrigger( triggerTime )
  });

}

main.js

Предложение обновить данные

const registration = await navigator.serviceWorker.ready;
if ('showTrigger' in Notification.prototype) {

  registration.showNotification('Reminder', {
    tag: 'update-content',
    body: "Click to sync with the server",
      
    // Tomorrow, same time
    showTrigger: new TimestampTrigger(Date.now() + 24 * 60 * 60 * 1000)
  });

}

main.js

Явное действие пользователя

self.addEventListener('notificationclick', (event) => {
  if (event.notification.tag === 'update-content') {
    
    event.waitUntil(updateContentAndLaunchApp());
  }
});

service-worker.js

Доступность и детали

  • Платформа и ОС

  • Браузер и его версия

  • Настройки и флаги браузера

  • Адрес сайта

  • Статус установки приложения

Длинный ответ

Доступность и детали

Короткий ответ

* Progressive = "Прогрессивное улучшение"

*

Более 100 новых API

Подведем итоги

  • Цель: догнать и перегнать возможности "нативного" кода

  • Пользовательский опыт: баланс возможностей и "неудобностей"

  • Для разработчиков: часть веб-стандартов, удобные инструменты

Все только начинается

  • 2000+ разработчиков

  • Представители браузеров, фреймворков и библиотек

  • Все о PWA на русском языке

Спа-си-бо!

Максим Сальников

@webmaxru

Пишите в твиттер

Ваши вопросы

Максим Сальников

@webmaxru

Фоновые сервисы в браузерах - есть ли жизнь после закрытия вкладки?

By Maxim Salnikov

Фоновые сервисы в браузерах - есть ли жизнь после закрытия вкладки?

Пользователь закрывает вкладку в браузере, и ваше замечательное фронтенд-приложение испаряется. А что если можно было бы оставить какие-то его части еще немного поработать во благо улучшения UX? Отреагировать на какие-то события, завершить начатое общение с сетью - в общем, исполнить немного кода при закрытой вкладке и даже браузере. Я расскажу о разных интересных возможностях API из семейства сервис-воркеров, позволяющих продлить жизнь приложения, чтобы всегда иметь под рукой свежие данные, не бояться проблем с сетью, уметь показывать уведомления - все ради отличного пользовательского опыта.

  • 3,201