Сделайте ваше PWA больше похожим на приложение

Опубликовано: 15 июня 2020 г.

Когда вы играете в модное словечко «прогрессивные веб-приложения», можно смело утверждать, что «PWA — это всего лишь веб-сайты». Документация Microsoft PWA с этим согласна , мы это утверждаем , как и номинанты PWA Фрэнсис Берриман и Алекс Рассел . Да, PWA — это всего лишь веб-сайты, но они представляют собой нечто гораздо большее. При правильном подходе PWA будет восприниматься не как веб-сайт, а как настоящее приложение.

Но что значит ощущать себя настоящим приложением?

Возьмём в качестве примера приложение Apple Podcasts . Оно доступно на macOS для настольных компьютеров и на iOS (и iPadOS соответственно) для мобильных устройств. Хотя Podcasts — это медиаприложение, основные идеи, которые я иллюстрирую с его помощью, применимы и к другим категориям приложений.

iPhone и MacBook рядом, на обоих запущено приложение Podcasts.
Подкасты Apple на iPhone и macOS ( Источник ).

Возможность работы в автономном режиме

Подумайте о платформенно-зависимых приложениях на вашем мобильном телефоне или компьютере. Одно бросается в глаза: вы всегда можете ими воспользоваться. В приложении «Подкасты», даже если я офлайн, всегда есть чем заняться или что посмотреть. Даже при отсутствии подключения к сети приложение всё равно открывается. В разделе «Топ-чарты» нет никакого контента, вместо этого отображается сообщение «Не удаётся подключиться прямо сейчас» с кнопкой «Повторить попытку» .

Приложение «Подкасты» выдает сообщение о том, что «не удается подключиться», хотя сетевое подключение отсутствует.

Сделайте это в Интернете

Приложение «Подкасты» следует так называемой модели оболочки приложения. Весь статический контент, необходимый для отображения основного приложения, кэшируется локально, включая декоративные изображения, такие как значки левого меню и значки основного интерфейса плеера. Динамический контент, такой как данные о топ-чартах, загружается только по запросу, а локально кэшированный резервный контент доступен в случае сбоя загрузки. Прочитайте статью «Модель оболочки приложения» , чтобы узнать, как применить эту архитектурную модель к вашему веб-приложению.

Доступен офлайн-контент и воспроизведение мультимедиа

Находясь в автономном режиме, в левом ящике я по-прежнему могу перейти в раздел «Загруженные» и воспроизвести загруженные эпизоды подкаста, которые отображаются со всеми метаданными, включая обложки и описания.

Приложение «Подкасты» с загруженным выпуском подкаста.
Загруженные эпизоды подкаста можно воспроизводить даже без подключения к сети.

Сделайте это в Интернете

Ранее загруженный медиаконтент можно отдавать из кэша, например, с помощью команды «Сервировать кэшированные аудио и видео» из библиотеки Workbox . Остальной контент всегда можно хранить в кэше или в IndexedDB. Подробнее об этом и о том, когда использовать ту или иную технологию хранения, читайте в статье «Хранилище для веба» . Если у вас есть данные, которые необходимо хранить постоянно, без риска их удаления при исчерпании доступной памяти, вы можете использовать API постоянного хранения .

Проактивная фоновая загрузка

Когда я снова подключусь к сети, я, конечно, смогу искать контент с помощью запроса типа http 203 , и когда я решу подписаться на результат поиска, подкаст HTTP 203 , последний эпизод сериала будет загружен немедленно, без каких-либо вопросов.

Приложение «Подкасты» загружает последний выпуск подкаста сразу после подписки.
После подписки на подкаст последний выпуск загружается мгновенно.

Сделайте это в Интернете

Загрузка эпизода подкаста — это операция, которая может занять больше времени. API Background Fetch позволяет делегировать загрузку браузеру, который выполняет её в фоновом режиме.

На Android браузер, в свою очередь, может даже делегировать эти загрузки операционной системе, поэтому браузеру не нужно быть постоянно запущенным. После завершения загрузки активируется сервис-воркер вашего приложения, и вы можете решить, что делать с ответом.

Взаимодействуйте и делитесь с другими приложениями

Приложение «Подкасты» естественным образом интегрируется с другими приложениями. Например, щёлкнув правой кнопкой мыши по понравившемуся выпуску, я могу поделиться им с другими приложениями на моём устройстве, например, с приложением «Сообщения». Оно также естественным образом интегрируется с системным буфером обмена. Я могу щёлкнуть правой кнопкой мыши по любому выпуску и скопировать ссылку на него.

Контекстное меню приложения «Подкасты», вызванное для эпизода подкаста с выбранной опцией «Поделиться эпизодом → Сообщения».
Публикация эпизода подкаста в приложении «Сообщения».

Сделайте это в Интернете

API Web Share и API Web Share Target позволяют вашему приложению обмениваться текстами, файлами и ссылками с другими приложениями на устройстве. Хотя веб-приложения пока не могут добавлять пункты меню во встроенное контекстное меню операционной системы, существует множество других способов связываться с другими приложениями на устройстве. С помощью API Async Clipboard вы можете программно считывать и записывать текстовые и графические данные (изображения PNG) в системный буфер обмена. На Android вы можете использовать API Contact Picker для выбора записей из менеджера контактов устройства. Если вы предлагаете как платформенно-зависимое приложение, так и PWA, вы можете использовать API Get Installed Related Apps для проверки того, установлено ли платформенно-зависимое приложение. В этом случае вам не нужно побуждать пользователя устанавливать PWA или принимать push-уведомления.

Обновление фонового приложения

В настройках приложения «Подкасты» я могу настроить автоматическую загрузку новых выпусков. Так мне даже не нужно об этом думать, обновлённый контент всегда будет доступен. Волшебство.

Подкасты настроены на обновление вашей ленты для получения новых эпизодов подкаста каждый час.

Сделайте это в Интернете

API периодической фоновой синхронизации позволяет вашему приложению регулярно обновлять контент в фоновом режиме, не запуская его. Это означает, что новый контент доступен заранее, и ваши пользователи могут сразу же начать его использовать, когда захотят.

Состояние синхронизировано через облако

Мои подписки синхронизируются на всех моих устройствах. В этом бесшовном мире мне не нужно беспокоиться о ручной синхронизации подписок на подкасты. Кроме того, мне не нужно беспокоиться о том, что память моего мобильного устройства будет занята выпусками, которые я уже слушал на компьютере. Состояние воспроизведения синхронизируется, а прослушанные выпуски автоматически удаляются.

Меню настроек приложения «Подкасты» в разделе «Дополнительно», где активирована опция «Синхронизировать подписки на разных устройствах». Состояние синхронизируется через облако.

Сделайте это в Интернете

Синхронизация данных о состоянии приложения — это задача, которую можно делегировать API фоновой синхронизации . Сама операция синхронизации не обязательно должна выполняться немедленно, а лишь со временем , возможно, даже после того, как пользователь уже закрыл приложение.

Аппаратные клавиши управления медиа

Когда я занят другим приложением, например, читаю новости в браузере, я всё равно могу управлять приложением «Подкасты» с помощью клавиш управления мультимедиа на ноутбуке. Нет необходимости переключаться в приложение, чтобы просто перемотать вперёд или назад.

Клавиатура Apple MacBook Pro Magic Keyboard с аннотированными клавишами управления мультимедиа.
Медиа-клавиши позволяют управлять приложением «Подкасты».

Сделайте это в Интернете

Media Session API поддерживает медиа-клавиши. Таким образом, пользователи могут использовать аппаратные медиа-клавиши на физических клавиатурах, наушниках или даже управлять веб-приложением с помощью программных медиа-клавиш на умных часах. Кроме того, можно использовать вибросигнал , когда пользователь прокручивает значительную часть контента, например, просматривает начальные титры или переходит к границе главы.

Многозадачность и ярлыки приложений

Конечно, я всегда могу вернуться к приложению «Подкасты» из любой точки мира. У приложения есть хорошо заметный значок, который я также могу разместить на рабочем столе или в панели приложений, чтобы запускать подкасты сразу, когда мне захочется.

Переключатель задач macOS с несколькими значками приложений на выбор, один из которых — приложение «Подкасты».
Возвращаемся к приложению «Подкасты» в режиме многозадачности.

Сделайте это в Интернете

Прогрессивные веб-приложения как для настольных компьютеров, так и для мобильных устройств можно установить на главный экран, в меню «Пуск» или на панель приложений. Установка может выполняться по запросу или полностью контролироваться разработчиком приложения. В статье « Что нужно для установки?» вы найдете всю необходимую информацию. В режиме многозадачности PWA-приложения работают независимо от браузера.

Быстрые действия в контекстном меню

Наиболее распространённые действия приложения — «Поиск нового контента» и «Проверка новых эпизодов» — доступны прямо из контекстного меню приложения в доке. В меню «Параметры» также можно выбрать, открывать ли приложение при входе в систему.

Контекстное меню значка приложения «Подкасты» с опциями «Поиск» и «Проверка наличия новых эпизодов».
Быстрые действия доступны сразу же через значок приложения.

Сделайте это в Интернете

Указав ярлыки значков приложений в манифесте веб-приложения PWA, вы можете регистрировать быстрые маршруты к часто используемым задачам, к которым пользователи смогут обращаться непосредственно со значка приложения. В операционных системах, таких как macOS, пользователи также могут щелкнуть правой кнопкой мыши по значку приложения и настроить его запуск при входе в систему. В настоящее время ведется работа над предложением по запуску при входе в систему .

Действовать как приложение по умолчанию

Другие приложения iOS, а также веб-сайты и электронные письма могут интегрироваться с приложением «Подкасты», используя URL-адрес вида podcasts:// . Если я перейду по ссылке типа podcasts://podcasts.apple.com/podcast/the-css-podcast/id1042283903 в браузере, я сразу попаду в приложение «Подкасты» и смогу подписаться или послушать подкаст.

Браузер Chrome отображает диалоговое окно с вопросом о том, хочет ли пользователь открыть приложение «Подкасты».
Приложение «Подкасты» можно открыть прямо из браузера.

Сделайте это в Интернете

Обработка полностью настраиваемых схем URL пока невозможна, но в настоящее время разрабатывается предложение по обработке протоколов URL для PWA. Лучшим вариантом является registerProtocolHandler() с префиксом схемы web+ .

Интеграция с локальной файловой системой

Возможно, вы не сразу это заметили, но приложение «Подкасты» естественным образом интегрируется с локальной файловой системой. Когда я загружаю выпуск подкаста на свой ноутбук, он сохраняется в папке ~/Library/Group Containers/243LU875E5.groups.com.apple.podcasts/Library/Cache . В отличие, скажем, от ~/Documents , этот каталог не предназначен для прямого доступа обычных пользователей.

Другие механизмы хранения, помимо файлов, упоминаются в разделе, посвященном автономному контенту .

MacOS Finder перешел в системный каталог приложения «Подкасты».
Эпизоды подкаста хранятся в специальной папке системного приложения.

Сделайте это в Интернете

API доступа к файловой системе (File System Access API) позволяет разработчикам получать доступ к локальной файловой системе устройства. Вы можете использовать его напрямую или с помощью библиотеки поддержки браузера (browser-fs-access) , которая прозрачно обеспечивает резервный доступ для браузеров, не поддерживающих этот API. Из соображений безопасности системные каталоги недоступны через веб.

Внешний вид и поведение платформы

Есть и более тонкая функция, которая очевидна для приложений iOS, таких как «Подкасты». Ни одна из текстовых меток не может быть выделена, и весь текст сливается с системным шрифтом устройства. Кроме того, мой выбор системной цветовой темы (например, тёмный режим) также учитывается.

Приложение «Подкасты» в тёмном режиме.
Приложение «Подкасты» поддерживает светлый и темный режимы.
Приложение «Подкасты» в облегченном режиме.
Приложение использует системный шрифт по умолчанию.

Сделайте это в Интернете

Используя свойство CSS user-select со значением none , вы можете защитить элементы пользовательского интерфейса от случайного выбора. Однако не злоупотребляйте этим свойством, чтобы сделать содержимое приложения невыбираемым. Его следует использовать только для элементов пользовательского интерфейса, таких как тексты кнопок и т. д. Значение system-ui свойства CSS font-family позволяет указать шрифт пользовательского интерфейса по умолчанию, который будет использоваться в вашем приложении. Наконец, ваше приложение может подчиняться предпочтениям пользователя, уважая его выбор prefers-color-scheme , с опциональным переключением на темный режим для его переопределения. Еще один вопрос, который следует решить, — что должен делать браузер при достижении границы области прокрутки, например, реализовать пользовательское действие pull to refresh . Это возможно с помощью свойства CSS overscroll-behavior .

Настраиваемая строка заголовка

Взглянув на окно приложения «Подкасты», вы заметите, что в нем нет классической интегрированной строки заголовка и панели инструментов, как, например, в окне браузера Safari, а есть настраиваемый интерфейс, который выглядит как боковая панель, прикрепленная к основному окну плеера.

Интегрированная панель плиток и панель инструментов браузера Safari.
Настраиваемые заголовки Safari и Подкастов.

Сделайте это в Интернете

Настройка заголовка окна имеет ограниченные возможности. Вы можете (и должны) указать свойства display и theme-color в манифесте веб-приложения. Это определяет внешний вид окна вашего приложения и определяет, какие элементы управления браузера по умолчанию должны отображаться (возможно, ни одного).

Мгновенные анимации

Анимация в приложении «Подкасты» очень чёткая и плавная. Например, когда я открываю панель заметок к эпизодам справа, она элегантно выезжает. Когда я удаляю один эпизод из загрузок, оставшиеся эпизоды всплывают и занимают освободившееся после удаления пространство на экране.

Приложение «Подкасты» с расширенным разделом «Заметки к эпизодам».
Анимации в приложении, например при открытии ящика, происходят очень быстро.

Сделайте это в Интернете

Эффективная анимация в вебе, безусловно, возможна, если учитывать ряд рекомендаций, изложенных в статье «Анимация и производительность» . Анимацию прокрутки, часто встречающуюся в постраничном контенте или каруселях мультимедиа, можно значительно улучшить с помощью функции CSS Scroll Snap . Для полного контроля можно использовать API веб-анимации .

Контент появился за пределами приложения

Приложение «Подкасты» на iOS может отображать контент в других местах, помимо самого приложения, например, в системном представлении «Виджеты» или в виде предложений Siri.

Проактивные призывы к действию, основанные на использовании и требующие всего лишь нажатия для взаимодействия, могут значительно повысить показатель повторного вовлечения в такое приложение, как Podcasts.

Виджет iOS отображает приложение «Подкасты», предлагающее новый эпизод.

Сделайте это в Интернете

Используйте API индекса контента в своём приложении, чтобы сообщить браузеру, какой контент PWA доступен офлайн. Это позволит браузеру отображать этот контент за пределами основного приложения. Размечая интересный контент в своём приложении как подходящий для воспроизведения аудио и используя структурированную разметку , вы можете помочь поисковым системам и виртуальным помощникам, таким как Google Assistant, представить ваши предложения в идеальном свете.

Виджет управления мультимедиа на экране блокировки

Во время воспроизведения эпизода подкаста приложение «Подкасты» отображает на экране блокировки красивый виджет управления, содержащий метаданные, такие как обложка эпизода, название эпизода и название подкаста.

Виджет воспроизведения мультимедиа iOS на экране блокировки, показывающий эпизод подкаста с расширенными метаданными.
Воспроизведением мультимедиа в приложении можно управлять с экрана блокировки.

Сделайте это в Интернете

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

Push-уведомления

Push-уведомления в интернете стали немного раздражать (хотя уведомления теперь стали гораздо тише ). Но при правильном использовании они могут принести большую пользу. Например, приложение «Подкасты» для iOS может при необходимости уведомлять меня о новых выпусках подкастов, на которые я подписан, или рекомендовать новые, а также оповещать о новых функциях приложения.

Приложение iOS Podcasts на экране настроек «Уведомления» показывает активированный переключатель уведомлений «Новые эпизоды».
Приложения могут отправлять push-уведомления, чтобы информировать пользователя о новом контенте.

Сделайте это в Интернете

API Push позволяет вашему приложению получать push-уведомления, чтобы вы могли оповещать пользователей о важных событиях, происходящих в вашем PWA. Для уведомлений, которые должны срабатывать в определённое время в будущем и не требуют подключения к сети, можно использовать API триггеров уведомлений .

Значок приложения

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

Экран настроек iOS с активированным переключателем «Значки».
Значки — это незаметный способ для приложений информировать пользователей о новом контенте.

Сделайте это в Интернете

Вы можете устанавливать значки приложений с помощью API Badging . Это особенно полезно, если в вашем PWA есть понятие «непрочитанных» элементов или вам нужно ненавязчиво привлечь внимание пользователя к приложению.

Воспроизведение мультимедиа имеет приоритет над настройками энергосбережения

Во время воспроизведения подкаста экран может отключаться, но система не переходит в режим ожидания. Приложения также могут поддерживать экран в активном состоянии, например, для отображения текстов песен или субтитров.

Настройки macOS в разделе «Экономия энергии».
Приложения могут держать экран активным.

Сделайте это в Интернете

Используйте API Screen Wake Lock, чтобы предотвратить отключение экрана. Воспроизведение мультимедиа в интернете автоматически предотвращает переход системы в режим ожидания.

Обнаружение приложений через магазин приложений

Хотя приложение «Подкасты» входит в состав десктопной версии macOS, на iOS его необходимо установить из App Store. Быстрый поиск по запросу podcast , podcasts или apple podcasts мгновенно находит приложение в App Store.

Поиск по запросу «подкасты» в магазине приложений iOS выдает приложение «Подкасты».
Пользователи научились находить приложения в магазинах приложений.

Сделайте это в Интернете

Хотя Apple не разрешает размещать PWA в App Store, в Android вы можете отправить свой PWA, обернутый в Trusted Web Activity . Скрипт bubblewrap упрощает эту процедуру. Этот скрипт также отвечает за функцию экспорта Android-приложений в PWABuilder , которую можно использовать без использования командной строки.

Краткое описание функций

В этой таблице представлен краткий обзор всех функций и список полезных ресурсов для их реализации в Интернете.

Особенность Полезные ресурсы для этого в Интернете
Возможность работы в автономном режиме
Доступен офлайн-контент и воспроизведение мультимедиа
Проактивная фоновая загрузка
Совместное использование и взаимодействие с другими приложениями
Обновление фонового приложения
Состояние синхронизировано через облако
Аппаратные клавиши управления медиа
Многозадачность и ярлыки приложений
Быстрые действия в контекстном меню
Действовать как приложение по умолчанию
Интеграция с локальной файловой системой
Внешний вид и поведение платформы
Настраиваемая строка заголовка
Мгновенные анимации
Контент появился за пределами приложения
Виджет управления мультимедиа на экране блокировки
Push-уведомления
Значок приложения
Воспроизведение мультимедиа важнее настроек энергосбережения
Обнаружение приложений через магазин приложений

Заключение

PWA прошли долгий путь с момента своего появления в 2015 году. В рамках проекта Fugu 🐡 межкорпоративная команда Chromium работает над устранением последних пробелов. Следуя хотя бы некоторым из наших советов, вы сможете приблизиться к ощущению, схожему с настоящим приложением, и заставить пользователей забыть, что они имеют дело «просто с веб-сайтом». В конечном счёте, большинству пользователей неважно, как устроено ваше приложение (да и почему должно быть?), главное, чтобы оно ощущалось как настоящее приложение.

Благодарности

Этот документ был проверен Кейсом Баскесом , Джо Медлей , Джошуа Беллом , Дионом Альмером , Эйдом Ошиная , Питом ЛеПейджем , Сэмом Торогудом , Рейли Грантом и Джеффри Яскином .