Уведомление Chrome Push: этот сайт был обновлен в фоновом режиме

При реализации push-уведомления Chrome мы получали последние изменения с нашего сервера. При этом сервис-воркер показывает дополнительное уведомление с сообщением

Этот сайт был обновлен в фоновом режиме

Уже пробовал с предложением, размещенным здесь https://disqus.com/home/discussion/html5rocks/push_notifications_on_the_open_web/
Но пока ничего полезного не нашел. Есть ли какие-либо предложения?


person Md. Mashiur Rahman Chowdhury    schedule 29.06.2015    source источник


Ответы (6)


Как правило, как только вы получаете push-сообщение от GCM (Google Cloud Messaging), вы должны показать push-уведомление в браузере. Это упоминается в 3-м пункте здесь:

https://developers.google.com/web/updates/2015/03/push-notificatons-on-the-open-web#what-are-the-limitations-of-push-messaging-in-chrome-42

Таким образом, может случиться так, что вы каким-то образом пропускаете push-уведомление, хотя вы получили push-сообщение от GCM, и вы получаете push-уведомление с некоторым сообщением по умолчанию, например «Этот сайт был обновлен в фоновом режиме».

person Satyajit Dey    schedule 02.07.2015
comment
Что означает GCM? - person Ripon Al Wasim; 02.07.2015
comment
Обратите внимание, что на самом деле вы должны показать уведомление перед выполнением обещания, которое вы передаете в event.waitUntil(). По сути, передавая обещание, вы говорите, что я закончил, когда это разрешится, и в это время не стесняйтесь проверять, что я показал уведомление своим пользователям - person owencm; 10.05.2016
comment
другими словами, как упоминалось в ответе @Yogendra, вам нужно вернуть уведомление о показе, чтобы уведомление было разрешено до того, как обещание будет разрешено - person jaafar Nasrallah; 28.12.2016
comment
Эта ссылка старая, проверьте мой ответ (2018) - person ; 21.02.2018
comment
Этот ответ действителен также для уведомлений firebase (FCM). - person nilsmagnus; 29.08.2018

Я столкнулся с той же проблемой, но после долгих исследований я узнал, что это связано с задержкой между событием PUSH и self.registration.showNotification(). Я пропустил только ключевое слово return перед self.registration.showNotification()

Итак, вам нужно реализовать следующую структуру кода, чтобы получить уведомление:

var APILINK = "https://xxxx.com";
 self.addEventListener('push', function(event) {
      event.waitUntil(
          fetch(APILINK).then(function(response) {

        return response.json().then(function(data) {
                  console.log(data);
                  var title = data.title;
                  var body = data.message;
                  var icon = data.image;
                  var tag = 'temp-tag';
                  var urlOpen = data.URL;

                return  self.registration.showNotification(title, {
                      body: body,
                      icon: icon,
                      tag: tag
                  })
              });
          })
      );
  });
person Yogendra    schedule 19.08.2015
comment
Для всех, у кого есть эта проблема, нужно вернуть не только self.registration.showNotification. Каждая вложенная функция должна возвращать обещание. Я узнал об этом из этого сообщения: stackoverflow.com/a/33187502/1451657 - person Aaron; 14.04.2016
comment
@Yogendra: Значит, мне нужно создать API для контента? - person Mehul Tandale; 16.10.2016
comment
@Mehul Tandale, да, вам нужно создать API для отображения контента в ползунке уведомлений. но теперь хром также начал доставлять произвольный контент (полезную нагрузку), который вы можете изучить подробнее. - person Yogendra; 17.10.2016
comment
Спасибо за разъяснение @Yogendra - person Mehul Tandale; 17.10.2016
comment
У меня есть упрощенный ответ, проверьте ниже. - person ; 21.02.2018
comment
У меня такая же проблема при обработке push-уведомлений переднего плана веб-приложения с помощью Firebase FCM JS SDK. Когда мое веб-приложение находится на переднем плане, я получаю полезную нагрузку уведомления от прослушивателя onMessage(), затем использую этот блок кода для отображения уведомления в области уведомлений, и, наконец, я получил 2 уведомления (одно от себя и одно Этот сайт был обновлен. ..): navigator.serviceWorker.ready.then(registration => { registration.showNotification(title, options); }); - person Dev; 22.01.2020

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

  1. Вы не показываете уведомление в ответ на push-сообщение. Каждый раз, когда вы получаете push-сообщение на устройстве, когда вы заканчиваете обработку события, уведомление должно оставаться видимым на устройстве. Это связано с подпиской с параметром userVisibleOnly: true (хотя обратите внимание, что это необязательно, и если его не установить, подписка не будет выполнена.
  2. Вы не вызываете event.waitUntil() в ответ на обработку события. Обещание должно быть передано в эту функцию, чтобы указать браузеру, что он должен дождаться разрешения обещания, прежде чем проверять, отображается ли уведомление.
  3. По какой-то причине вы разрешаете обещание, переданное event.waitUntil, до того, как было показано уведомление. Обратите внимание, что self.registration.showNotification является обещанием и асинхронным, поэтому вы должны быть уверены, что оно разрешено до того, как обещание, переданное event.waitUntil, будет разрешено.
person owencm    schedule 04.01.2016

Это работает, просто скопируйте/вставьте/измените. Замените «return self.registration.showNotification()» приведенным ниже кодом. Первая часть предназначена для обработки уведомления, вторая часть — для обработки щелчка уведомления. Но не благодарите меня, если только вы не благодарите меня за часы гугления ответов.

А если серьезно, то спасибо Мэтту Гонту по адресу developers.google.com

self.addEventListener('push', function(event) {
  console.log('Received a push message', event);

  var title = 'Yay a message.';
  var body = 'We have received a push message.';
  var icon = 'YOUR_ICON';
  var tag = 'simple-push-demo-notification-tag';
  var data = {
    doge: {
        wow: 'such amaze notification data'
    }
  };

  event.waitUntil(
    self.registration.showNotification(title, {
      body: body,
      icon: icon,
      tag: tag,
      data: data
    })
  );
});

self.addEventListener('notificationclick', function(event) {
  var doge = event.notification.data.doge;
  console.log(doge.wow);
});
person Community    schedule 21.02.2018

Я пытался понять, почему в Chrome есть это требование, согласно которому работник службы должен отображать уведомление при получении push-уведомления. Я считаю, что причина в том, что работники службы push-уведомлений продолжают работать в фоновом режиме даже после того, как пользователь закрывает вкладки веб-сайта. Таким образом, чтобы веб-сайты не могли тайно запускать код в фоновом режиме, Chrome требует, чтобы они отображали какое-либо сообщение.

Каковы ограничения push-уведомлений? сообщения в Chrome?

...

  • Вы должны показать уведомление, когда вы получаете push-сообщение.

...

и

Почему бы не использовать Интернет Сокеты или события, отправленные сервером (EventSource)?

Преимущество использования push-сообщений в том, что даже если ваша страница закрыта, ваш сервис-воркер проснется и сможет показать уведомление. Соединение Web Sockets и EventSource закрывается при закрытии страницы или браузера.

person Carl G    schedule 22.01.2020
comment
Все ли зарегистрированные работники службы уведомлений перезапускаются при запуске Chrome (настольный компьютер)? - person Carl G; 22.01.2020
comment
Это имеет смысл для меня - person Anthony; 14.10.2020

Если вам нужно, чтобы во время получения события push-уведомления произошло что-то еще, showNotification() возвращает Promise. Таким образом, вы можете использовать классическую цепочку.

const itsGonnaBeLegendary = new Promise((resolve, reject) => {
    self.registration.showNotification(title, options)
        .then(() => {
            console.log("other stuff to do");

            resolve();
        });
});

event.waitUntil(itsGonnaBeLegendary);
person Vitezslav Lindovsky    schedule 05.09.2018