Невозможно загрузить URL-адрес данных для push-уведомлений GCM для Chrome в событии "messagesclick"

Работая над push-уведомлениями GCM для Chrome, я настроил push-уведомления на случай, когда работник службы получает push-уведомление для GCM.

Я запускаю сервисный звонок. Эта служба возвращает объект данных, в котором у меня есть URL, который я хочу открыть в тот момент, когда пользователь нажимает на уведомление.

Вот код, который у меня есть.

Var urlOpen = null;
self.addEventListener('push', function(event) {
    event.waitUntil(
        fetch(serviceLink).then(function(response) {
            if (response.status !== 200) {
                console.log('Looks like there was a problem. Status Code: ' +
                response.status);
                throw new Error();
            }
            return response.json().then(function(data) {
                console.log(data);
                var title = data.title;
                var body = data.desc;
                var icon = data.image;
                var tag = 'notification tag';
                urlOpen = data.clickUrl;


              return  self.registration.showNotification(title, {
                    body: body,
                    icon: icon,
                    tag: tag
                })
            });
        })
    );
});


self.addEventListener('notificationclick', function(event) {
        event.waitUntil(
        clients.openWindow(urlOpen).then(function (){
         event.notification.close();}));

});

Это работает нормально, но иногда на некоторых устройствах уведомления. Но при нажатии на уведомления открывается null в строке браузера.

Что я делаю неправильно?

1 ответ

Решение

Вы не можете рассчитывать на вашего работника службы, существующего между push событие и notificationclick событие. Браузер может очень хорошо закрыть работника после push событие было обработано, а затем перезапустите его для notificationclick событие, означающее, что ваш urlOpen переменная была переинициализирована в null,

Я думаю, что вы, вероятно, можете как-то сохранить URL-адрес на самом объекте уведомления, что было бы лучше - похоже, здесь есть пример этого. В противном случае вам придется сохранить его в indexedDB или что-то в этом роде.

Другие вопросы по тегам