Предотвращение закрытия процесса браузера на мобильных устройствах

#android #ios #progressive-web-apps #web-wake-lock

#Android #iOS #progressive-веб-приложения #веб-блокировка после пробуждения

Вопрос:

Я пытаюсь создать таймер PWA (в основном для мобильных устройств), который уведомляет пользователя по истечении определенного времени. (Пользователи будут знать об этом и захотят, чтобы это произошло, так что запрос разрешения не будет проблемой.)

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

С помощью API Wakelock я могу предотвратить блокировку экрана — если мы находимся на устройстве и в браузере, который это поддерживает. (К сожалению, многие этого не делают.) В NoSleep.js библиотека добавляет поддержку для большего количества устройств, воспроизводя видео, которое пользователь не видит. Так что это уже кое-что.

Однако, если пользователь активно включает экран блокировки (что многие делают инстинктивно, когда, скажем, кладут свои телефоны в карманы), процесс будет приостановлен iOS или Android через некоторое время. Это означает, что уведомление будет отложено до тех пор, пока пользователь снова не откроет браузер. Это может произойти гораздо позже, что сведет на нет всю цель этого приложения.

Если бы я разрабатывал собственное приложение, я мог бы использовать что-то вроде соответствующего UIBackgroundMode или фоновой выборки на iOS или WorkManager на Android. Однако создание этого как собственного приложения не будет иметь преимуществ PWA, таких как то, что установка не требуется или что мы можем обновлять приложение по желанию.

Насколько я понимаю, многие (все?) Производители браузеров, похоже, не хотят, чтобы веб-сайты могли работать в фоновом режиме. Тем не менее, есть ли способ создать такой PWA? Или мне придется переключиться на создание собственного приложения? (Который все еще может бороться с операционной системой, как описано на таких страницах, как dontkillmyapp.com .)

Комментарии:

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

2. @DimaRostopira Я согласен, что это приведет к значительному расходу заряда батареи. Для конкретного варианта использования, который я имею в виду, это было бы приемлемо, хотя, конечно, альтернатива, у которой нет этой проблемы, была бы лучше. Что касается запланированных уведомлений, я предполагаю, что вы имеете в виду триггеры уведомлений ( web.dev/ notification-triggers )? Если это так, то они, похоже, все еще находятся в разработке и не получили широкой поддержки. Поэтому мы не можем по-настоящему полагаться на них. Или я что-то упускаю?

Ответ №1:

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

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

Например:

 const createScheduledNotification = async (tag, title, timestamp) => {
  const registration = await navigator.serviceWorker.getRegistration();
  registration.showNotification(title, {
    tag: tag,
    body: "The 30 second timer is up!",
    showTrigger: new TimestampTrigger(timestamp   30 * 1000)
  });
};
 

Комментарии:

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